我编写了以下代码来打印两个整数之间的数据。但我无法找到错误,因为代码看起来很好。请帮忙。
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);
}
}
}
答案 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
中获得任何其他数字。