解题思路: 由题意可知1-9都要出现,且只能出现一次。自然想到用全排列来做,只需要加入一些判断即可(最后面的完整改进后完整代码有一些细节讲解)


注意事项: 在这个网站可以运行但是在蓝桥杯网站运可能会超时

参考代码(1):在这个网站可以运行,但是在蓝桥杯网站会超时,但是也可以学习一些一些函数及字符串处理

#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;

//这种方法超时,因为多次用了substr()来截取字符串,每次都要拷贝,和扫描
//过于耗时
int main(){
	int n;
	int ans = 0;
	cin>>n;
	std::string s = "123456789"; 
	do {
			for(int i=0;i<=7;i++){
				string a=s.substr(0,i); 
				int inta = atoi(a.c_str());
				if(inta >= n) break;
				
				for (int j=1;j<=9-i-1;j++){
					string b = s.substr(i,j);
					string c = s.substr(i+j,9);
					int intb = atoi(b.c_str());
					int intc = atoi(c.c_str());
					if(intb%intc==0&&inta+intb/intc==n) ans++;
				}
				
			}
		} while(std::next_permutation(s.begin(),s.end())) ;
		
	cout<<ans;
	return 0;
}

改进代码:因为我们的atoi函数没有选择字符串长度就是只转化某个位置的字符串,所以我们需要自己定义一个转化函数。

//pos代表串开始的位置,len代表长度(包含pos) 
int parse(const char *arr,int pos,int len){
	int ans = 0;
	int t = 1;
	for(int i=pos+len-1-1;i>=pos-1;i--){
		ans+=(arr[i]-'0')*t;
		t*=10;
	}
	return ans;
}

改进后完整代码:

#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;

int parse(const char *arr,int pos,int len){
	int ans = 0;
	int t = 1;
	for(int i=pos+len-1-1;i>=pos-1;i--){
		ans+=(arr[i]-'0')*t;
		t*=10;
	}
	return ans;
}
int main(){
	int n;
	int ans = 0;
	cin>>n;
	std::string s = "123456789"; 
	do {
			const char *str = s.c_str();// 由于s.c_str()这个函数返回的是const的类型,
										// 所以我们上面定义的函数的参数也要是const
			for(int i=0;i<=7;i++){
				int inta = parse(str,1,i); // +号前的数字 
				if(inta >= n) break; // 如果单inta就>=n,那后面就不用遍历了,进入下一种排列
				
				for (int j=1;j<=9-i-1;j++){
				int intb=parse(str,i+1,j); // +和/中间的数字
				int intc=parse(str,i+j+1,9-i-j); // / 后面的数字
				if(intb%intc==0&&inta+intb/intc==n) ans++;
				}
				
			}
		} while(std::next_permutation(s.begin(),s.end())) ;
		
	cout<<ans;
	return 0;
}



点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论