程序在c中的两个整数之间打印阿姆斯特朗号。不能在代码中找到错误

时间:2017-10-07 08:23:24

标签: c

我编写了以下代码来打印两个整数之间的数据。但我无法找到错误,因为代码看起来很好。请帮忙。

void main()
{
    int a,b;
    printf("Enter the starting limit");
    scanf("%d",&a);
    printf("Enter the ending limit");
    scanf("%d",&b);
    int i;
    int sum=0;
    for(i=a+1;i<b;i++)
    {
        char word[50];
        sprintf(word,"%d",i);
        int temp=strlen(word);
        int j;
        for(j=0;j<temp;j++)
        {
            int c=i%10;
            sum+=pow(c,temp);
            i=i/10;

        }
        if (sum==i)
        {
            printf("%d",i);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

正如有人回答的那样 - 我也会回答。仅使用整数运算。不需要任何字符串或双打

#include <stdio.h>

typedef unsigned long long ull;    // for convenience only


ull sum_cubes(ull num)
{
    ull result = 0;
    while(num)
    {
        unsigned digit = num % 10;
        result += (ull)digit * digit * digit;
        num /= 10;
    }
    return result;
}

#define MIN  0           //or 100 depending if 001 is the 3 digints number or not.
#define MAX  1000


int main(void)
{
    for(ull num = MIN; num < MAX; num++)
    {
        if(num == sum_cubes(num))
        {
            printf("Hurray!! Found - %llu\n", num);
        }
    }
}

答案 1 :(得分:-1)

您在外部i循环的控制表达式中使用for但在内循环中使用i修改i=i/10;
即使单次执行该行也将确保i的值小于其初始值 然后,此修改后的i会在外部i++循环中使用for递增。 如果a小于b,则i<b将始终为真,从而导致无限循环。

但是由于你在word中有字符串形式的数字,你可以使用它。

 for(j=0;j<temp;j++)
 {
     int c=word[j]-48;

-48用于将编码字符值(例如:ASCII中的2为50)转换为实际数字。如果您使用的编码不是ASCII,则可能需要执行不同的操作。

您还可以在进入内循环之前制作i的副本,并在内循环中使用该变量而不是i,如

    int t=i, j;
    for(sum=j=0;j<temp;j++)
    {
        int c=t%10;
        sum+=pow(c,temp);
        t=t/10;
    }

在内循环的每次迭代之前,您没有将sum的值重置为0。您可以在循环的第一部分(即,在第一个分号之前)执行此操作,如上面的循环中那样。

同样正如Bo所指出的那样,pow()会返回float,并且由于解释的原因here,可能会出现不准确的情况。

因此,请将sum的类型设为float而不是int

使用void作为main()的返回类型不被视为良好做法。请改用int main()。请参阅here

使用%运算符取数字的部分也是错误的。

 int c=i%10;

在内循环的所有迭代中,c的值将是i的最后一位数,并且您将不会在c中获得任何其他数字。