解题思路:
首先,用函数计算一个整数是否为平方数,为平方数,才可继续计算是否能由两个平方数拼接;然后,将平方数的每位数字变成字符存入字符串,从低址到高址分别存放从低位到高位的数字,为了模拟原数,需要反转字符串存入另一字符数组;接下来,找到两段字符串的分界点,用来分开后拼接,在分界点之前取得前段字符串,在分界点之后取得后段字符串,再转换成对应的两个整数,若非零并且都为平方数,原数即为拼接平方数。

注意事项:
为了取得前后两段字符串,本想用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;
}


点赞(1)
 

0.0分

2 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论