左嘉


私信TA

用户名:zuojia

访问量:82299

签 名:

Jz

等  级
排  名 4
经  验 33540
参赛次数 226
文章发表 72
年  龄 40
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

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

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

  评论区