1

これをご覧いただきありがとうございます。

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;
}
4

1 に答える 1