1

最初の整数が x であるとします。次に、a[0]=x を定義すると、シーケンスの次の要素は次のように計算されます。

a[n+1]=a[n]/2   if a[n] is even, and 
a[n+1]=a[n]*3+1 if a[n] is odd. 

The sequence continues till it reach value 1, then stop. 

こんな感じ75, 226, 113, 340, 170, 85, 256, 128, 64, 32, 16, 8, 4, 2, 1

これは私のコードです(再帰を使用していません)。問題は、常に output=1 を出力し続けることです。確認しましたが、どこが間違っていたのかわかりません。別の質問は、変数 x と配列 a[] に対して宣言するのに最適なデータ型はどれかということです (最小の容量に最小化するには?そして、再帰を使用してこれを行うにはどうすればよいでしょうか?

int main(void)
{
    float a[100];
    int i=0;
    float x;
    printf("Enter the value of x: ");
    scanf("%f",&x);
    a[0]=x;
    printf("\n%f\n",a[0]);
    do{
        if (fmod(a[i],2)==0){
            a[i+1]=a[i]/2;}
        else{
            a[i+1]=a[i]*3+1;        
        }
        i++;
    } while (a[i]!=1);
    printf("The ouput value is:\n");
    for (int j=0;j<i;j++){
        printf("%2.2f\t",a[i]);
    }
    getch();
    return 0;
}
4

4 に答える 4

4

問題は、output=1 を常に出力し続けることです。

もちろん、常に配列の最後の数値の後に数値を出力するためです (プログラムには未定義の動作さえあります)。

もう 1 つの質問は、変数 x と配列 a[] に対して宣言するのに最適なデータ型はどれかということです (容量を最小限に抑えるには?

どちらも である可能性がunsigned long longあり、配列は必要ありません。

char buf[0x100];
fgets(buf, sizeof(buf), stdin);
unsigned long long n = strtoull(buf, NULL, 10);
while (n > 1) {
    printf("%ull\n", n);
    n = n % 2 ? 3 * n + 1 : n / 2;
}
于 2013-05-27T05:49:37.313 に答える
3

再帰的な方法で単一のwhileループですべての計算を行うだけです...コードのこの部分を置き換えてください...

printf("\n%f\n",a[0]);
do{
    if (fmod(a[i],2)==0){
        a[i+1]=a[i]/2;}
    else{
        a[i+1]=a[i]*3+1;        
    }
    i++;
} while (a[i]!=1);
printf("The ouput value is:\n");
for (int j=0;j<i;j++){
    printf("%2.2f\t",a[i]);
}

みたいなものに置き換えて……。

    while(a[i] > 1){
     printf("\n%f\n",a[i]);
     if(fmod(a[i],2)==0){
       a[i+1]=a[i]/2;
     }else{
       a[i+1]=a[i]*3+1;        
     }
     i++;
    }

私はそれをテストしませんでしたが、計算に外部関数を使用したくない場合、この問題の再帰の主なアイデアはそのようなものでなければなりません。この再帰的な方法により、常に1を印刷する問題も修正されました。ご覧のとおり、コードで常に 1 を印刷することについての回答は既に得られています。浮動小数点配列の代わりに long int を使用できます。これはいい考えだと思います。次に、配列 a[i] と a[i+1] を int 変数に置き換えて、コードを変更する必要があります。

私の悪い英語でごめんなさい。英語は私の母国語ではありません。ありがとう。

于 2013-05-27T06:16:25.850 に答える
1

常に 1 を出力する理由は、for ループで間違った変数を使用したためです

for (int j=0;j<i;j++){
    printf("%2.2f\t",a[i]);
}

アクセスしa[j]ないでa[i]ください。iはループ内で一定です。に変更する必要があります

for (int j=0;j<i;j++){
    printf("%2.2f\t",a[j]);
}
于 2013-05-27T05:46:12.953 に答える
1

あなたの問題の一部、

問題は、output=1 を常に出力し続けることです。

printf("The ouput value is:\n");
    for (int j=0;j<i;j++){
        printf("%2.2f\t",a[i]); //<--- use a[j] to print instead of a[i]
    }
于 2013-05-27T05:47:03.287 に答える