Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C kaprekar数计算失败超过两位数_C - Fatal编程技术网

C kaprekar数计算失败超过两位数

C kaprekar数计算失败超过两位数,c,C,为什么代码不起作用?我无法获得有效的输出。请帮我找出输入是否是卡普雷卡数。我想我把它弄得太复杂了。有没有简单方法的建议 例如: 9是Kaprekar数,因为9²=81&8+1=9 297是Kaprekar数,因为297²=88209&88+209=297。下面是代码 代码如下: #include <stdio.h> int main() { int n, a, temp, length, sum = 0, s, i, rem, temp1, length1, sum1[

为什么代码不起作用?我无法获得有效的输出。请帮我找出输入是否是卡普雷卡数。我想我把它弄得太复杂了。有没有简单方法的建议

例如:

  • 9是Kaprekar数,因为9²=81&8+1=9
  • 297是Kaprekar数,因为297²=88209&88+209=297。下面是代码
代码如下:

#include <stdio.h>

int main() {
    int n, a, temp, length, sum = 0, s, i, rem, temp1, length1, sum1[10], sum2[10];

    printf("n");
    scanf("%d", &n);

    a = n * n;
    printf("%d\n", a);

    temp = a;
    length = 0;

    while (temp > 0) {    
        length++;
        temp = temp / 10;    
    }

    temp1 = n;
    length1 = 0;

    while (temp1 > 0) {    
        length1++;
        temp1 = temp1 / 10;    
    }

    if (length1 == 1) {    
        for (i = 0; i < length; i++) {        
            rem = a % 10;
            sum = sum + rem;
            a = a / 10;
        }
        if (sum == n) {        
            printf("Kaprekar number");
        } else {        
            printf("not a kaprekar number");        
        }    
    }

    if (length1 > 1) {   
        s = length / 2; 

        for (i = 0; i < s; i++) {        
            printf("%d\n", sum1[i]);         
        }

        for (i = s; i < length; i++) {        
            printf("%d\n", sum2[i]);        
        }

        for (i = 0; i < length; i++) {        
            sum3[i] = sum1[i] + sum2[i];        
        } 
    }
    return 0;
}
#包括
int main(){
int n,a,temp,length,sum=0,s,i,rem,temp1,length1,sum1[10],sum2[10];
printf(“n”);
scanf(“%d”和“&n”);
a=n*n;
printf(“%d\n”,a);
温度=a;
长度=0;
而(温度>0){
长度++;
温度=温度/10;
}
temp1=n;
长度1=0;
而(temp1>0){
长度1++;
temp1=temp1/10;
}
如果(长度1==1){
对于(i=0;i1){
s=长度/2;
对于(i=0;i
您的代码有一些错误,因为您曾经没有初始化用于打印和添加的
sum1
sum2
数组。其次,没有定义数组
sum3[]
。此外,如果您的数字大于
2147483647
,这意味着如果
a
大于约46340,则会出现溢出

我对这个问题很感兴趣,下面是我的实现

#include <stdio.h>
#include <math.h>

int get_length(long long n){
    int s = 0;
    while (n>0){
        s++;
        n /= 10;
    }
    return s;
}

int is_kaprekar (long long n){
    long long t, n2=n*n;
    int i,s = get_length(n2);
    t = pow(10,s);
    for (i=0 ; i<s ; i++){
        long long left,right;
        left = n2/t;
        right = n2%t;
        if ((long long)(left+right) == n && left != t){
            printf("%lld\n",n); // print n
            printf("%lld\n",n2); // print n^2
            printf("%lld\n",left); 
            printf("%lld\n",right);
            printf("Kaprekar number\n");
            return 1;
        }
        t/=10;
    }
    printf("not a kaprekar number");
    return 0;
}

int main()
{
    long long n,i,n2;
    printf("n ");
    scanf("%d",&n); // get n
    is_kaprekar(n);

    return 0;
}
#包括
#包括
int get_长度(长n){
int s=0;
而(n>0){
s++;
n/=10;
}
返回s;
}
int is_kaprekar(长n){
长t,n2=n*n;
int i,s=获取长度(n2);
t=功率(10,s);
对于(i=0;i,根据这一点,Kaprekar数的定义如下:

在数学中,一个非负整数被称为给定基数的Kaprekar数,如果它在该基数中的平方表示可以分为两部分,加起来等于原始数,但前提是由平方的低阶数字构成的部分必须非零,尽管它允许包含前导零例如,45是Kaprekar数,因为452=2025,20+25=45。数字1在每个基数中都是Kaprekar,因为在任何基数中12=01,0+1=1。Kaprekar数以D.R.Kaprekar命名

您的方法似乎太复杂,无法修复。下面是一个更简单的方法:

  • 将数字平方。我建议使用较大的类型,如
    unsigned long
    ,以避免在计算过程中出现算术溢出
  • 在循环中迭代,将平方除以10的幂,直到被除数小于10。如果余数不为零,且平方的商和被除数除以10的幂等于原始数,则为Kaprekar数
下面是一个简单的实现:

#include <stdio.h>

int test_kaprekar(unsigned long long n) {
    unsigned long long quo, rem, pow10, square = n * n;
    int i;

    for (i = 1, pow10 = 10;; i++, pow10 *= 10) {
        quo = square / pow10;
        rem = square % pow10;
        if (quo + rem == n && rem != 0) {
            printf("%llu is a Kaprekar number: %llu*%llu = %llu, %llu+%.*llu = %llu\n",
                   n, n, n, square, quo, i, rem, n);
            return 1;
        }
        if (quo < 10)
            break;
    }
    return 0;
}

int main() {
    unsigned long long i, start = 0, stop = 4294967295, count = 0;
    for (i = start; i <= stop; i++) {
        count += test_kaprekar(i);
    }
    printf("%llu Kaprekar numbers between %llu and %llu\n", count, start, stop);
    return 0;
}

10减1的所有幂都是以10为基数的Kaprekar数,其他Kaprekar数在log10(n)附近十分罕见,介于10n和10n+1之间。

以下是我的建议,以简化代码,并希望使其更易于调试

  • 定义一个返回位数的函数
  • 定义一个函数,给定原始数字中的位数,将正方形分成多个数字
  • 计算平方的各部分之和,并将其与原始数字进行比较

  • int getNumberOfDigits(int n)
    {
    如果(n==0)
    {
    返回1;
    }
    整数计数=0;
    而(n/10>0)
    {
    n/=10;
    ++计数;
    }
    返回计数;
    }
    空分方格(整数方格,整数原始数字计数,整数输出[2])
    {
    int左=正方形;
    int right=0;
    对于(int=0;i
    请格式化您的代码。从字面上看…@dei是没有意义的。在为新海报修复后,我们很高兴告诉他们有关格式和缩进的信息。这里有一个“尽最大努力,我们将帮助您完成其余工作”思考。El Khan适当的缩进确实有助于理解您的代码,从而帮助您。此外,让潜在的回答者保持尽可能好的心情符合您的利益。您能提供kaprekar数的定义吗?您给出了示例,但这不足以制作或理解算法。什么是
    sizeof(int)
    在您的环境中?如果是2,则可能只是范围问题。在这种情况下,请尝试使用
    long int
    。对于297,它已打印为非卡普雷卡号,但实际上是卡普雷卡号。我认为右半部分出了问题。您能检查一下吗???@ElKhan您确定运行了此代码吗?这是pr正确地为我输入右半和左半,并根据您在问题中的描述回答
    Kaprekar number
    @ElKhan我认为您应该将数字一分为二,但根据定义,您可以从任何位置将其拆分!我以前的代码没有
    1 is a Kaprekar number: 1*1 = 1, 0+1 = 1
    9 is a Kaprekar number: 9*9 = 81, 8+1 = 9
    45 is a Kaprekar number: 45*45 = 2025, 20+25 = 45
    55 is a Kaprekar number: 55*55 = 3025, 30+25 = 55
    99 is a Kaprekar number: 99*99 = 9801, 98+01 = 99
    297 is a Kaprekar number: 297*297 = 88209, 88+209 = 297
    703 is a Kaprekar number: 703*703 = 494209, 494+209 = 703
    999 is a Kaprekar number: 999*999 = 998001, 998+001 = 999
    2223 is a Kaprekar number: 2223*2223 = 4941729, 494+1729 = 2223
    2728 is a Kaprekar number: 2728*2728 = 7441984, 744+1984 = 2728
    4879 is a Kaprekar number: 4879*4879 = 23804641, 238+04641 = 4879
    4950 is a Kaprekar number: 4950*4950 = 24502500, 2450+2500 = 4950
    5050 is a Kaprekar number: 5050*5050 = 25502500, 2550+2500 = 5050
    5292 is a Kaprekar number: 5292*5292 = 28005264, 28+005264 = 5292
    7272 is a Kaprekar number: 7272*7272 = 52881984, 5288+1984 = 7272
    7777 is a Kaprekar number: 7777*7777 = 60481729, 6048+1729 = 7777
    9999 is a Kaprekar number: 9999*9999 = 99980001, 9998+0001 = 9999
    17344 is a Kaprekar number: 17344*17344 = 300814336, 3008+14336 = 17344
    22222 is a Kaprekar number: 22222*22222 = 493817284, 4938+17284 = 22222
    38962 is a Kaprekar number: 38962*38962 = 1518037444, 1518+037444 = 38962
    77778 is a Kaprekar number: 77778*77778 = 6049417284, 60494+17284 = 77778
    82656 is a Kaprekar number: 82656*82656 = 6832014336, 68320+14336 = 82656
    95121 is a Kaprekar number: 95121*95121 = 9048004641, 90480+04641 = 95121
    99999 is a Kaprekar number: 99999*99999 = 9999800001, 99998+00001 = 99999
    ...
    86358636 is a Kaprekar number: 86358636*86358636 = 7457814011780496, 74578140+11780496 = 86358636
    88888888 is a Kaprekar number: 88888888*88888888 = 7901234409876544, 79012344+09876544 = 88888888
    91838088 is a Kaprekar number: 91838088*91838088 = 8434234407495744, 84342344+07495744 = 91838088
    94520547 is a Kaprekar number: 94520547*94520547 = 8934133805179209, 89341338+05179209 = 94520547
    99999999 is a Kaprekar number: 99999999*99999999 = 9999999800000001, 99999998+00000001 = 99999999
    234567901 is a Kaprekar number: 234567901*234567901 = 55022100179545801, 55022100+179545801 = 234567901
    243902440 is a Kaprekar number: 243902440*243902440 = 59488400237953600, 5948840+0237953600 = 243902440
    332999667 is a Kaprekar number: 332999667*332999667 = 110888778222110889, 110888778+222110889 = 332999667
    432432432 is a Kaprekar number: 432432432*432432432 = 186997808245434624, 186997808+245434624 = 432432432
    567567568 is a Kaprekar number: 567567568*567567568 = 322132944245434624, 322132944+245434624 = 567567568
    665188470 is a Kaprekar number: 665188470*665188470 = 442475700620940900, 44247570+0620940900 = 665188470
    667000333 is a Kaprekar number: 667000333*667000333 = 444889444222110889, 444889444+222110889 = 667000333
    765432099 is a Kaprekar number: 765432099*765432099 = 585886298179545801, 585886298+179545801 = 765432099
    867208672 is a Kaprekar number: 867208672*867208672 = 752050880792003584, 75205088+0792003584 = 867208672
    909090909 is a Kaprekar number: 909090909*909090909 = 826446280826446281, 82644628+0826446281 = 909090909
    999999999 is a Kaprekar number: 999999999*999999999 = 999999998000000001, 999999998+000000001 = 999999999
    1111111111 is a Kaprekar number: 1111111111*1111111111 = 1234567900987654321, 123456790+0987654321 = 1111111111
    1776299581 is a Kaprekar number: 1776299581*1776299581 = 3155240201460775561, 315524020+1460775561 = 1776299581
    2020202020 is a Kaprekar number: 2020202020*2020202020 = 4081216201612080400, 408121620+1612080400 = 2020202020
    2646002646 is a Kaprekar number: 2646002646*2646002646 = 7001330002639001316, 7001330+002639001316 = 2646002646
    3846956652 is a Kaprekar number: 3846956652*3846956652 = 14799075482367049104, 1479907548+2367049104 = 3846956652
    3888938889 is a Kaprekar number: 3888938889*3888938889 = 15123845682376554321, 1512384568+2376554321 = 3888938889
    4090859091 is a Kaprekar number: 4090859091*4090859091 = 16735128102417346281, 1673512810+2417346281 = 4090859091
    4132841328 is a Kaprekar number: 4132841328*4132841328 = 17080377442424803584, 1708037744+2424803584 = 4132841328
    110 Kaprekar numbers between 0 and 4294967295
    
    int getNumberOfDigits(int n)
    {
       if ( n == 0 )
       {
          return 1;
       }
    
       int count = 0;
       while ( n / 10 > 0 )
       {
          n /= 10;
          ++count;
       }
    
       return count;
    }
    
    void divideSquare(int square, int originalDigitCount, int out[2])
    {
        int left = square;
        int right = 0;
        for ( int = 0; i < originalDigitCount; ++i )
        {
           right  = right*10 + left%10;
           left /= 10;
        }
        out[0] = left;
        out[1] = right;
    }
    
    int main()
    {
        for (int n = 0; n < 10000; ++n )
        {
           int square = n * n;
           int out[2];
           int count = getNumberOfDigits(n);
           divideSquare(square, count, out);
           if ( out[0] + out[1] == n )
           {
              printf("%d is a Kaprekar number\n", n);
           }
        }
     }