Kaprekar数

  • Description

     一个Kaprekar数(雷劈数,或卡普利加数)是个非负整数,将它的平方分成两部分,这两部分之和正好是原来的数字。例如,297是一个Kaprekar 数:297² = 88209, 88 + 209 = 297. 在这里,平方分成的第二部分可以从0开始,但不能是负数。例如, 999是一个Kaprekar 数:999² = 998001, 998 + 001 = 999;但100不是:100² = 10000,100 + 00 = 100, 其中第二部分为0了.
    

在数学上,假设X是一个非负整数。在十进制计数中,X是一个Kaprekar 数,当且仅当存在非负整数n, A, 和整数B满足下列三个条件::

0 < B <10n

X² = A10n + B

X = A + B

在十进制计数中,常见的Kaprekar数有:

1, 9, 45, 55, 99, 297, 703

  • Input

输入包含多个测试用例(不超过100)。每个测试用例包括一行。给出一个整数 (位数不超过1000)。一行“0”表示所有输入结束,无需处理此例。

  • Output

对于每个测试用例,输出一行,依次包含:

l “Case #: ”,#表示序号

l 如果测试用例中的数为Kaprekar数,则输出Yes,否则输出No

  • Sample Input

999
101
4879
0

  • Sample Output

Case 1: Yes
Case 2: No
Case 3: Yes

#include<iostream>
#include<string>
using namespace std;
#define N 1010
void Mul(char *str1,char *str2,char *str3)
{
    int i,j,i1,i2,tmp,carry,jj;
    int len1=strlen(str1),len2=strlen(str2);
    char ch;
    jj=carry=0;
    for(i1=len1-1;i1>=0;--i1){
        j=jj;
        for(i2=len2-1;i2>=0;--i2,++j){
            tmp=(str3[j]-'0')+(str1[i1]-'0')*(str2[i2]-'0')+carry;
            if(tmp>9){
                carry=tmp/10;str3[j]=tmp%10+'0';
            }
            else{
                str3[j]=tmp+'0';carry=0;
            }
        }
        if(carry){
            str3[j]=carry+'0';carry=0;++j;
        }
        ++jj;
    }
    --j;
    while(str3[j]=='0'&&j>0)--j;
    str3[++j]=0;
    for(i=0,--j;i<j;++i,--j){
        ch=str3[i];str3[i]=str3[j];str3[j]=ch;
    }
}

void Add(char *str1,char *str2,char *str3)
{
    int i,j,i1,i2,tmp,carry;
    int len1=strlen(str1),len2=strlen(str2);
    char ch;
    i1=len1-1;i2=len2-1;
    j=carry=0;
    for(;i1>=0&&i2>=0;++j,--i1,--i2){
        tmp=str1[i1]-'0'+str2[i2]-'0'+carry;
        carry=tmp/10;
        str3[j]=tmp%10+'0';
    }
    while(i1>=0){
        tmp = str1[i1--]-'0'+carry;
        carry=tmp/10;
        str3[j++]=tmp%10+'0';
    }
    while(i2>=0){
        tmp=str2[i2--]-'0'+carry;
        carry=tmp/10;
        str3[j++]=tmp%10+'0';
    }
    if(carry)str3[j++]=carry+'0';
    str3[j]=0;
    for(i=0,--j;i<j;++i,--j){
        ch=str3[i];str3[i]=str3[j];str3[j]=ch;
    }
}

int main()
{
   //freopen("in.txt","r",stdin);
    char str1[N],str2[2*N],temp[N],sum[N];
    int times=0;
    while(scanf("%s",str1)!=EOF)
    {    
        getchar();
        int i,j,k,ok=0;
        if(strcmp(str1,"0")==0)break;
        printf("Case %d: ",++times);
        memset(str2,'0',sizeof(str2));
        memset(temp,'0',sizeof(temp));
        Mul(str1,str1,str2);
        int len=strlen(str2);
        i=0;
        if(len>=10)
            i=len/2-6;
        for(;i<=len/2+2;i++)
        {
            memset(sum,'0',sizeof(sum));
            for(j=0;j<=i;j++)
                temp[j]=str2[j];
            temp[j]=0;
            for(k=i;k<len && str2[k]=='0';k++);
            if(k==len)continue;
            Add(temp,str2+j,sum);
            for(j=0;sum[j]=='0';j++);
            if(strcmp(sum+j,str1)==0)
            {
                ok=1;
                break;
            }
        }
        if(ok)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;

}

你可能感兴趣的:(Kaprekar数)