2017-10-07 35 views
1

我寫了下面的代碼來打印兩個整數之間的阿姆斯特朗數。但我無法找到錯誤,因爲代碼對我來說很好。請幫忙。程序打印在兩個整數之間的阿姆斯特朗數在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); 
     } 
    } 
} 
+0

'pow'使用浮點數,例如可能會生成'24.9999999'而不是'25'。 –

+0

有沒有其他方法可以建議? –

+0

對於整數,它只是乘法,例如'pow(5,3)'與'5 * 5 * 5'相同。 –

回答

-1

您在外for循環的控制表達,但在你與i=i/10;修改i內循環使用i
即使只執行一行,也會確保i的值小於其初始值。
然後,此修改後的i與外部for循環中的i++一起遞增。 如果a小於b,i<b將始終爲真,導致無限循環。

但是由於您在word中以字符串形式存在數字,因此可以使用該數字。

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

-48用於將編碼的字符的值(例如:2 ASCII是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得到任何其他數字。

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); 
     } 
    } 
} 
+0

只是說,但如果其數字的立方體的數量和總和相等,則只有當數字是3位數字時,該數字纔是阿姆斯壯。我想OP使用'strlen()'來查找數字的位數。 –

+0

@J ... S確實很難改變。將MAX更改爲1000,您可以將typedef從'unsigned long long'更改爲'unsigned' –

相關問題