首页 > 解决方案 > 修改后的 Kaprekar 数字 | 黑客等级

问题描述

修改后的 Kaprekar 数是具有d位数字的正整数n,因此,当我们将其正方形分成两部分时 - 一个具有d位数字的右手部分r和一个包含剩余dd-1位数字的左手部分l ,碎片的总和等于原始数量(即l + r = n)。

注意: r 可能有前导零。

这是维基百科关于原始卡普雷卡数的解释(发现差异!):在数学中,给定基数的卡普雷卡数是一个非负整数,其平方在该基数中的表示可以分为两部分,加再次恢复到原来的数字。例如,45 是一个 Kaprekar 数,因为 45² = 2025 和 20+25 = 45。

任务

给定两个正整数pq,其中p小于q。编写一个程序来确定在 和 之间的范围内有多少个 Kaprekar 数(包括两者),并将它们全部显示出来。

void kaprekarNumbers(int p, int q) {
int flag=0,cpy,i,dx,sq,d,n;
long int left,right;
while(1)
{
    if(p>q) 
    {
        if(flag==0) printf("INVALID RANGE");
        exit(0);
    }
    else{
    d=0,dx=0;;
    n=p;
    while(n>0){
    d+=1;
    n=n/10;
    }
    sq=p*p;
    while(sq>0){
        dx+=1;
        sq=sq/10;
    }
    sq=p*p;
    char str[dx];
    cpy=dx-1;
    while(sq>0){
        str[cpy--]=(sq%10)+48;
        sq=sq/10;
    }
    left=0,right=0;
    for(i=0;i<dx-d;i++)
    {
        left+=(str[i]-48)*pow(10,dx-d-1-i);
    }
    char r[d];
    int k=0;
    for(i=dx-d;i<dx;i++)
    {
        r[k++]=str[i];
    }
    for(i=0;i<d;i++)
    {
        right+=(r[i]-48)*pow(10,d-1-i);
    }
    if(left+right==p) 
    {
        printf("%d ",p);
        flag=1;
    }
    p+=1;
    }
}}

这个逻辑在 1/7 的测试用例中失败,以至于它错过了打印范围内的一些 kaprekar 数字并单独打印其余部分。如果有人更正这段代码,那将有很大帮助。TIA

标签: arrayscalgorithm

解决方案


推荐阅读