2017-11-09 3 views
0
#include <stdio.h> 

int main(){ 
    int n,copy,counter=0,prevcounter,prev; 
    scanf("%d",&n); 
    while(n>0){ 
     counter = 0; 
     n--; 
     copy = n; 
     while(copy>0){ 
      --copy; 
      if(n%copy==0){ 
       counter++;} 
       if(copy==0)break;  
      } 
     if(counter>prevcounter){ 
      prevcounter = counter; 
      prev = n; 
     } 

    } 
    printf("%d",prev); 
} 

に問題が私のコードです:問題は、このコードがループ永遠になり、問題はここは、だからここに永遠にループ

while(copy>0) 

ですが、私は

while(copy>1) 
にそれを変更した場合ということです

私はなぜそれが永遠にループするつもりだが、私は答えを見つけることができないようにしようとしています。私はコピーを減らしており、0になるとループから壊れるはずです。別のチェック

if(copy==0)break; 

が、それでも、それはdidntのwork..Anyのsugestions?ありがとう

+1

初期化する前に 'prevcounter'を使います。つまり、prevcounterの値は* indeterminate *(そして一見無作為)になります。 –

+2

また、ループが 'copy == 1 'で入力された場合、' copy == 0'を '--copy'して行います。そして、あなたはそれを分割で使って、ゼロと*未定義の振る舞い*に分割します。私はあなたが[あなたのプログラムをデバッグする方法を学ぶ]ことをお勧めします(https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。デバッガのコードを介して(論理的に考えても明白ですが)。 –

+1

if(copy == 0)break;を実行すると、if(n%copy == 0){'で0除算が実行されると思います。 – BLUEPIXY

答えて

3

また%ときcopy=0を使用しています。これは未定義の動作につながるバグです(ゼロで割ります)。

prevcounterは初期化されていません。あなたが実行中に出てくるかもしれcopyのすべての値を検討するために必要な

#include <stdio.h> 

int main(){ 
    int n,copy,counter=0,prevcounter=0,prev; 
    scanf("%d",&n); 
    while(n>0) 
    { 
     counter = 0; 
     n--; 
     copy = n; 
     while(copy>0) 
     { 
      --copy; 

      if(copy && n%copy==0){ 
       counter++; 
      } 

     } 
     if(counter>prevcounter){ 
      prevcounter = counter; 
      prev = n; 
     } 
    } 
    printf("%d",prev); 
} 

- :

コードは次のようなものになります。このループでは、copyがゼロになり、if(copy && n%copy==0)がそれを保証するケースを除外します。

+0

問題を解決していただきありがとうございます。私はモジュロについて心に留めておきます:D – jkuzmanovik

関連する問題