原题链接:蓝桥杯2013年第四届真题-带分数
解题思路: 由题意可知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分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复