解题思路:
首先,用函数计算一个整数是否为平方数,为平方数,才可继续计算是否能由两个平方数拼接;然后,将平方数的每位数字变成字符存入字符串,从低址到高址分别存放从低位到高位的数字,为了模拟原数,需要反转字符串存入另一字符数组;接下来,找到两段字符串的分界点,用来分开后拼接,在分界点之前取得前段字符串,在分界点之后取得后段字符串,再转换成对应的两个整数,若非零并且都为平方数,原数即为拼接平方数。
注意事项:
为了取得前后两段字符串,本想用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 人评分
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:721 |
【亲和数】 (C语言代码)浏览:541 |
C语言训练-尼科彻斯定理 (C语言代码)浏览:509 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1334 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:597 |
C语言训练-亲密数 (C语言代码)浏览:697 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:821 |
局部变量作函数返回值的问题浏览:1028 |
C二级辅导-阶乘数列 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:569 |