-1

問題#14を解決するために次のコードを使用しましたが、奇妙な理由で出力が表示されません。実行に時間がかかりすぎる可能性がありますか?PSIは、maxが答えになるはずがないことを知っていますが、それでも出力はありませんが、i<100のような小さい値の場合は出力を取得します。

#include <iostream>
long collatz(long);

int main()
{
  using namespace std;
 long i=3,max;
for(i=3;i<1000000;i++)
{
  max=collatz(i-1);
  if(collatz(i)>collatz(i-1))
  {
      max=collatz(i);
  }
  else
  {
      max=collatz(i-1);
  }
 }
cout<<max<<endl;
 cin.clear();
 cin.get();
}
long collatz(long n)
{
int count=0;
while(n!=1)
{
    if(n%2==0)
    {
        n=n/2;
        count+=1;
    }
    else
    {
        n=3*n+1;
    }
}
return count;
}
4

1 に答える 1

5

n = 113383 で collat​​z を呼び出すと、オーバーフローが発生し、n が負になり、そこから回復することはありません。したがって、1 になることはないため、無限ループになります。collat​​z 内で long long を使用する必要があります。

ただし、コラッツ関数には、他の人が指摘したように他の問題があります。また、メインのループのロジックは正しくありません。ループを通過するたびに最大値をリセットしています。したがって、報告する結果は collat​​z(999999) または collat​​z(999998) になります。しかし、それは正しい答えではありません。

于 2012-12-17T22:54:22.063 に答える