原题链接:蓝桥杯2014年第五届真题-拼接平方数
解题思路:
首先,用函数计算一个整数是否为平方数,为平方数,才可继续计算是否能由两个平方数拼接;然后,将平方数的每位数字变成字符存入字符串,从低址到高址分别存放从低位到高位的数字,为了模拟原数,需要反转字符串存入另一字符数组;接下来,找到两段字符串的分界点,用来分开后拼接,在分界点之前取得前段字符串,在分界点之后取得后段字符串,再转换成对应的两个整数,若非零并且都为平方数,原数即为拼接平方数。
注意事项:
为了取得前后两段字符串,本想用strncpy函数,可惜经测试发现:拷贝串后无法为串尾加结束符'\0',只好改用循环,通过下标访问两段新串,找到串尾,加上结束符。
参考代码:
#include<stdio.h> #include<math.h> #include<stdlib.h> int main(){ int is_p(int); int is_pp(int); int i,a,b; scanf("%d%d",&a,&b); for(i=a;i<=b;i++) if(is_pp(i)) printf("%d\n",i); //拼接平方数 return 0; } int is_p(int a){ int x=(int)sqrt(a); if(x*x==a) return 1; //平方数 else return 0; } int is_pp(int n){ char c,s[10],a[10],b[10]; int x,y,l,m,j,i=0; if(is_p(n)){ while(n){ a[i++]=n%10+'0'; //每位数字变成字符反向入串 n/=10; } a[i]='\0'; for(j=0;j<i;j++) s[j]=a[i-j-1]; //反转字符串 s[j]='\0'; a[0]=b[0]='\0'; for(i=1;i<j;i++){ //找到两段字符串的分界点 for(m=0;m<i;m++) a[m]=s[m]; a[m]='\0'; //取得前段字符串 for(m=i;m<j;m++) b[m-i]=s[m]; b[m-i]='\0'; //取得后段字符串 x=atoi(a); //前段对应的整数 y=atoi(b); //后段对应的整数 printf("%d %d\n",x,y); //观察中间结果 if(x&&y&&is_p(x)&&is_p(y)) return 1; } } return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复