アプリ版:「スタンプのみでお礼する」機能のリリースについて

専門学生です。コードについてなんですがわからなかったので質問させてください。
上から順にどんな動きをするのかを教えてください。特にに23行目のfor文のどんな動作を期待して実際にどう動くのかを知りたいです。

#include <stdio.h>

void main()
{
int a;
int b;
int sum;
int num;
for(a = 1; a < 10000; a++)
{
sum = 0;
num = 0;
for(b = 1; b < a; b++)
{
if(a % b == 0)
{
sum += b;
}
}
if(sum == a)
{
printf("%d", a);
for(b = 1; b < a; b++)
{
if(a % b == 0)
{
if(num != 0)
{
printf("+");
num = b;
printf("%d", num);
}
}
}
printf("\n");
}
}
}
自分自身以外の約数の総和が自分自身に等しくなる自然数を完全数と言う。例えば6の約数は1,2,3でその和は6となるので完全数である。10000以下の整数の中から、全ての完全数を探し出し表示するプログラムを作るというものです。

A 回答 (3件)

23行目からのコードは完全数の約数を


××=××+××+・・・・+××
という形式で出力することなんだろうけど
バグってて動かないね。
if (num != 0)
のelse側の処理が無い。写し忘れ?

aの出力の後に何か区切りになるものを出力していないのも変。

最初のforは完全数の候補を列挙するためのもの
2番目forは候補の約数を探し、その合計値を計算する
為のもの。

約数の探し方が下手なんで、遅いでしょうね。
    • good
    • 0

#include <stdio.h>



int main(void)
{
 int a;
 int b;
 int sum;
 int num;
 for(a = 1; a < 10000; a++) /* 被除数を増やしていく */
  {
   sum = 0;       /* 総和の初期化 */
   num = 0;
   for(b = 1; b < a; b++) /* 除数を増やしていくが被除数を超えない */
    {
     if(a % b == 0)   /* 除数が約数になってるかチェック */
      {
       sum += b;   /* 除数が約数なら総和に加算 */
      }
    }
   if(sum == a)      /* 完全数かチェック */
    {
     printf("%d", a);   /* 完全数なら出力 */
     for(b = 1; b < a; b++) /* 除数を増やしていくが被除数を超えない */
      {
       if(a % b == 0)  /* 除数が約数になってるかチェック */
        {
         if(num != 0) /* numは一回も変更されてないので、これ以降は無意味な計算になってる。 */
          {
           printf("+");
           num = b;
           printf("%d", num);
          }
        }
      }
     printf("\n");
    }
  }
}

/* ここまで */

別な人も書いてましたが、23行〜34行目まではループを回してるだけで事実上「何もしてません」。numに関する操作がどこにも定義されてないから、ですね。ずーっとnumは0のままなので、何も実行されてないのです。
恐らく"+"とか書かれてるんで、1 + 2 + 3 = 6とか表示したかったのでは。
    • good
    • 0

動かしてみましたか?



あ, 「どんな動作を期待して」はここで聞いちゃダメだよ. プログラムを書いた人に聞かないと.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A