1. ホーム
  2. c

[解決済み] 添加物持続性・添加物根源性プログラムが番号入力後に反応しない

2022-02-04 15:05:45

質問

初級C言語プログラミングの授業で宿題が出ました。

加法性とは、整数の桁数の和の性質である。桁の和を求め、その和に対して桁の和を行い、整数の1桁になるまで繰り返す。その繰り返しの回数が、その整数の加法的持続性である。例えば 次のような例です。

先頭の整数は1234

桁の和は1+2+3+4=10です。

整数は10になりました

その桁の和は 1 + 0 = 1 である。

整数が1桁になったら終了です。この最後の整数が加法性根

そのサイクル数が加法性持続性です。整数1234は加法性持続性が2(最初の和が10、次に2回目の和が1)である。最終的に到達する数字を整数の加法性根と呼ぶ。1234の加法性デジタルルートは1である。 というプログラムを書け。

正の整数を求めます。

与えられた整数が一桁の場合、加法性持続と乗法性持続を0、加法性根をそれ自身として報告します。

整数が 0 より小さい場合は、プログラムを終了する合図となります。

そうでない場合は、与えられた整数の加法的持続性と加法的根を求め、その結果をユーザに報告します。

ユーザーが終了するまで、プロンプトを表示し続けます。

これが私が考え出したコードです。



#include <stdio.h>

int main()
{
    int num;
    int pers = 0;
    int res = 0;
    int sig = 0;
    int sum = 0;
    int sum1 = 0;

    for (sig = 0;sig >= 0;) {
        printf("Please enter a positive integer to find the additive persistence, and the integer's additive digital root: ");
        scanf_s("%d", &num);
        if (num < 0) {
            sig--;
            break;
        }
        res = num;
        sum = 0;
        while((res>0)){

            sum = sum + (res % 10);
            res = num / 10;
            if (res == 0) {
                if (sum >= 10) {
                    res = sum;
                    sum = 0;

                }
                if (sum < 10)
                    pers++;


            }

        }


        printf("\nThe additive persistence is %d and the additive root is %d\n", pers, sum);




    }
    return 0;
}

コンパイルして実行すると、scanf文の後、プログラムが何もしません。なぜこのようなことが起こるのでしょうか?また、この課題を成功させるためのアドバイスがあれば教えてください。 よろしくお願いします。

解決方法は?

この行を考えてみてください。

res = num / 10;

の値は? res ループの1回目の実行後?そして2回目の実行後は?プログラムをデバッグするためにそこにプリントすると res は常に同じ値を持ち、変化しない。これは無限ループで、おそらく次のようなときに未定義の動作が発生するまで続くでしょう。 sum がオーバーフローしてしまいます。おそらく、代わりにこれが欲しかったのでしょう。

res = res / 10;