これをご覧いただきありがとうございます。
Code::Blocks で C で記述したこのプログラムを実行しようとすると、Windows エラー メッセージが表示されます。面白いことに、問題なくコンパイルされます。テストしている上限を下げると、プログラムも問題なく動作します。
詳細:
プログラムを実行しようとすると、最初に「X.exe が動作を停止しました。Windows は問題の解決策を確認しています」という Windows ポップアップが表示されます。まもなく、これは「X.exe が動作を停止しました。問題により、プログラムが正常に動作しなくなりました。Windows はプログラムを閉じ、解決策がある場合は通知します。(プログラムを閉じる)」に変わります。[プログラムを閉じる] ボタンをクリックしてから、 「プロセスが 255 <0xFF> 実行時間 3.940 秒を返しました。続行するには任意のキーを押してください」というコマンド プロンプトが表示されます。
私はWindows 8を持っています。
GNU GCC コンパイラを使用しています。
「最大」を 100000 に変更すると、プログラムは正常に動作します。
コードは次のとおりです。
/************************************************
* Finds the starting integer under 1000000 that
* produces the longest Collatz sequence, and the
* length of said sequence.
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <limits.h>
#define upto 1000000
int main()
{
long i;
long long j;
long long max = LONG_LONG_MAX;
long length = 0;
long number = 0;
long penull = 0;
long len[upto];
for (i = 0; i < upto; i++) (len[i] = 0);
// counts length of Collatz sequence for starting integers from 1 to 999999
for (i = 1; i < upto; i++)
{
j = i;
while (j != 1)
{
assert (j <= (max - 1)/3);
if (j%2 == 0) (j = j/2);
else (j = 3*j + 1);
len[i]++;
if (j < i)
{
len[i] = len[i] + len[j];
j = 1;
}
}
// stores length of the longest sequence and the starting integer producing it
if (len[i] > length)
{
length = len[i];
number = i;
}
// stores a duplicate length for later comparison
else if (len[i] == length) (penull = len[i]);
}
if (length == penull) (printf("There are at least two!"));
else printf("%ld produces a Collatz sequence of length %ld", number, length + 1);
return 0;
}