2016-10-20 9 views
1

私は "3n + 1"の質問を解決してuva onlinejudgeに提出しようとしていますが、私のコードが間違った答えを出し、残念ながら私はそれを見つけることができませんProblem 100uva onlinejudgeによる3n + 1の間違った答え

マイコード:

 #include <stdio.h> 
     int main() 
     { 
      unsigned long int n, m; 
      int max = 0; 
      scanf("%d %d", &n, &m); 

      int i; 
      for (i = n; i <m + 1; i++) 
      { 
       int ter = i; 
       int counter = 1; 
       while (ter != 1) 
       { 
        counter++; 

        if (ter % 2 == 1) { ter = 3 * ter + 1; } 

        else 
         ter = ter/2; 

        if (ter == 1) 
         if (counter>max) { max = counter; } 
       } 
      } 

      printf("%d %d %d\n", n, m, max); 

      return 0; 
     } 
+4

「3n + 1」?それは[Collat​​zの推測](https://en.wikipedia.org/wiki/Collat​​z_conjecture)ではないですか?サンプル入力で正しく機能しますか? –

+0

そして、使用するたびに正しい結果が得られますか?あなたが入力するあらゆる種類の価値について? 1つまたは両方の入力に負の数を入力するようなコーナーケースを試しましたか?ゼロ?非常に大きな数字ですか? 'n 'が' m'より大きかったり、 –

+0

私はあなたの 'counter'をゼロで始めるべきだと思います。 – smac89

答えて

0

正解:

#include <stdio.h> 

int cycleSize(int x) { 
int cycle = 1; 

while (x != 1) { 
    if (x % 2 == 0) { //if even 
     x = x/2; 
    } else { //if odd 
     x = x * 3 + 1; 
    } 
    ++cycle; 
} 
return cycle; 
} 

int maxCycleSizeBetween(int a, int b) { 
if (a > b) { //if b > a, swap them 
    int temp = a; 
    a = b; 
    b = temp; 
} 
int maxCycle = 0; 

for (; a <= b; a++) { 
    int thisCycleSize = cycleSize(a); 
    if (thisCycleSize > maxCycle) { 
     maxCycle = thisCycleSize; 
    } 
} 
return maxCycle; 
} 

int main() { 
int a, b; //input vars 

while (scanf("%d %d", &a, &b) != EOF) { 
    printf("%d %d %d\n", a, b, maxCycleSizeBetween(a, b)); 
} 
return 0; 
} 
+0

答えを見てください。 –

+0

未回答を回答として投稿しないでください。あなたはこれを答えに編集しましたが、最初のバージョンは実際にその質問に対する答えではありませんでした。ここで[答え]に関する質問をお読みください。 –

+0

可読性と理解を容易にするために、コードを一貫してインデントしてください – user3629249

1

問題がクリアされている問題 ここで質問です。あなたはiとjの間の全ての数を超える最大サイクル 長さを決定するためにある任意の2つの数iとjについては、問題文の

からの指示に従っていません。

入力は、整数iとj、行あたりの整数のいずれか ペアのペアの系列からなります。すべての整数は0

  1. より1,000,000 より大きい少なくなりますあなただけがi未満j
+0

あなたが言及した問題は修正されましたが、まだ私の答えが間違っていると言われます –

0

であることを前提としてい

  • に答えて入力し、印刷の1行を読んで次のコードは要件を実装します

    ただし、一部のオンラインコードコンテストでは、最終的な空白行が必要です。これらの種類の詳細を判断する必要があります。

    #include <stdio.h> 
    
    int main(void) 
    { 
        size_t n1; 
        size_t m1; 
        char buffer[1024]; 
    
        while(fgets(buffer, sizeof(buffer), stdin)) 
        { 
         if(2 != sscanf(buffer, "%lu %lu", &n1, &m1)) 
         { 
          break; 
         } 
    
         size_t n = n1; 
         size_t m = m1; 
    
         if(n1 > m1) 
         { // then first number greater than second so reverse for calculations 
          size_t temp = n; 
          n = m; 
          m = temp; 
         } 
    
         size_t maxCount = 0; 
         for (size_t i = n; i <= m; i++) 
         { 
          size_t ter = i; 
          size_t counter = 1; 
    
          while (ter != 1) 
          { 
           counter++; 
    
           if ((ter & 0x01) == 1) 
           { // then odd 
            ter = 3 * ter + 1; 
           } 
    
           else 
           { // else even 
            ter = ter/2; 
           } 
    
           // for testing only 
           // printf("%lu: %lu, %lu\n", counter, i, ter); 
          } 
    
          if(maxCount < counter) 
          { 
           maxCount = counter; 
          } 
         } 
    
         printf("%lu %lu %lu\n", n1, m1, maxCount); 
        } 
    } 
    

    注:

    1. このコードは非数値が
    2. を入力した場合EOFが発生した場合、このコードは終了します終了します - これは、負の場合
    3. このコードは失敗しますが予想されますしかし、入力された数字。コンテストの規定によれば、数字は1の範囲にあると言われています...1000000だけ<cr>は、以下の関数は、要求された計算を実行
  • +0

    こんにちは あなたのコードは正しい答えですが、問題(あなたのコードを見て変更した) –

    0

    を入力された場合、入力ライン上の唯一の数

  • このコードは終了しますので、もし負数
  • ためにこのコードをチェックする必要が終了しません。次のテストでは

    void n3plus1(int min, int max) 
    { 
        int i, n, len, lenmax=0; 
    
        for (i=min; i<=max; i++) 
        { 
         n= i; len= 1; 
         while (n!=1) { 
          if (n&1) 
           n= 3*n + 1; 
          else n= n/2; 
          len++; 
         } 
         if (len>lenmax) lenmax= len; 
        } 
        printf("Answer: %d %d %d\n", min,max,lenmax); 
    } 
    

    void test(void) 
    { 
        n3plus1(22, 22); 
        n3plus1(1, 10); 
        n3plus1(100, 200); 
        n3plus1(201, 210); 
        n3plus1(900, 1000); 
    } 
    

    出力は次のようになります。

    Answer: 22 22 16 
    Answer: 1 10 20 
    Answer: 100 200 125 
    Answer: 201 210 89 
    Answer: 900 1000 174 
    

    注:問題文の中で「iとj間のすべての数字の上に最大サイクル長は」ij含むものと解釈されなければなりません。

    コードは入力時にi<=jとします。コードは入力の読み込みを除きます。

  • 関連する問題