解题思路:
首先,用函数计算一个整数是否为平方数,为平方数,才可继续计算是否能由两个平方数拼接;然后,将平方数的每位数字变成字符存入字符串,从低址到高址分别存放从低位到高位的数字,为了模拟原数,需要反转字符串存入另一字符数组;接下来,找到两段字符串的分界点,用来分开后拼接,在分界点之前取得前段字符串,在分界点之后取得后段字符串,再转换成对应的两个整数,若非零并且都为平方数,原数即为拼接平方数。
注意事项:
为了取得前后两段字符串,本想用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分
3 人评分
数组输出 (C语言代码)浏览:767 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:702 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:748 |
【蟠桃记】 (C语言代码)浏览:664 |
矩形面积交 (C++代码)浏览:1127 |
永远的丰碑 (C语言代码)浏览:516 |
找出最长的字符串来 (C语言代码)浏览:1762 |
分解质因数 (C++代码)浏览:1471 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:382 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:636 |