2017-10-07 16 views
1

2つの整数間にアームストロング数を出力する次のコードを書いた。しかし、私はコードがうまく見えるので、間違いを見つけることができません。助けてください。あなたが外forループの制御式ではなく、あなたがi=i/10;iを変更している内部ループでiを使用cで2つの整数の間にアームストロング数を出力するプログラム。

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'は浮動小数点を使用しています。たとえば、' 25'ではなく '24.9999999'を生成します。 –

+0

お勧めの方法はありますか? –

+0

整数の場合、それは単に乗算であり、例えば 'pow(5,3)'は '5 * 5 * 5'と同じです。 –

答えて

-1


その行を1回実行しても、iの値がその初期値より小さいことが保証されます。
この修飾されたiは、外側のforループのi++で増分されます。 abより小さい場合、i<bは常に真となり、無限ループになります。

文字列の形の数字がwordにあるので、それを使うことができます。

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

-48は、符号化された文字の値(例:ASCII 2は50である)に変換するために使用される実際の数に。使用するエンコーディングがASCIIでない場合は、別の処理を行う必要があります。

また、内部ループに入る前にiのコピーを作成し、あなたがの各反復の前に0sumの値をリセットしていない

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

のような内側のループに代わりiの変数を使用することができます内側のループ上記のループのように、ループの最初の部分(つまり、最初のセミコロンの前)で行うことができます。 Boで指摘したように

はまた、pow()理由はhereを説いfloatとに起因して返し、不正確さがでクリープ性があります。

だからfloatの代わりintするsumの種類を作ります。

返品タイプmain()としてvoidを使用することは良い方法とは考えられません。代わりに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桁の数字のキューブの合計が等しい場合、その数字は3桁の数字である場合に限り、Armstrongです。私は、OPが 'strlen()'を使って桁数を見つけたとします。 –

+0

@ J ... S本当に変わるのは非常に難しいです。 MAXを1000に変更し、typedefを 'unsigned long long'から' unsigned'に変更することができます –

関連する問題