LoginSignup
4
0

More than 3 years have passed since last update.

【C++】連続する正の整数で約数の和が等しいペアを探すプログラム

Last updated at Posted at 2019-08-26

はじめに

前から何回かこのサイトを覗きお世話になることはありましたが、登録して記事を投稿させていただくのは初めてです。
そのためプログラムの内容ももちろんそうですが、そもそも記事の書き方に不慣れであることをご了承ください。

僕は学校でプログラムをやっているわけでも、数学を専攻しているわけでもない、ただの機械工学科生です。
しかし学校でほんの少しだけc++を習ったので今回それを用いて表題のようなプログラムを書いてみました。動機については後述します。
なので、数学的表現やプログラムの書き方に大いに問題があると思います。
実際あれだけ使うなと言われているgoto文を使用しています。使わずに処理を進める方法があれば教えてください。自分では思いつけませんでした。

普段やってる方からしたら笑ってしまうような記述もあると思います。
どれだけ細かいことでも改善点やおかしいところ等あればどんどん指摘して欲しいです。
今回投稿させていただくのは普段プログラムやってる方に見てもらって添削してもらえたら幸せだなぁという願望もあるので、ぜひよろしくお願いします!

動機

ある日、暇潰しにwikipediaの数字のページを眺めていました(数字のページっていうのはこういうやつです1 | wikipedia)。
ちなみに、このページに今回の題目である各数の約数の和が記載されています。
1から順番に数を大きくしていってそれぞれの数字が持つ性質に感心していたわけですが、14の次に15に飛んだ瞬間にあることに気が付きます。

14の約数の和と、15の約数の和が同じ24なのです。

これってすごくないですか?だから何?と言われてしまえばそこで終わってしまうことなのですが、自分はこういうどうでもいいことに感動してしまう人間なので気付いたときビックリしました。
他にこの組み合わせってないのかな?と思ったのですがwikipediaには約数の和が等しい数字のページは用意されていませんでした。
そこで、学校で昔c++を習ったことを思い出し、プログラムを使って他の組み合わせを発見することってできないのかな?と思ったのが動機です。
もしかしたら他にこんな数字の組み合わせないんじゃないか?とすら思いました(ありました)。
その数自身を含めなければ友愛数というとても素敵な名前が与えられているんですけどね。
なんでその数を約数に含めた瞬間こんなに影が薄くなっているんだろう?
もしかしたら自分はすごい変なことしてるかもしれないんですが、初めて自分でプログラム考えて書いたので記念に残しておきます。

c++のコード



#include<stdio.h>

int main()
{
    int i,i2,num,num2;
    int m= 0,m2=0;
    int answer;

    for (num = 1;; ++num) {

        int m = 0, m2 = 0;

        //約数を求める

        printf("%dの約数は ", num);
        for (i = 1; i <= num; ++i) {

            //次の組み合わせを探すが選択された際にここまでgotoでジャンプしてきます
            next:

            if (num%i == 0) {
                printf("%d ", i);
                //約数を求めた

                //約数の和を求める
                m = m + i;
                //約数の和を求めてそれをmに代入した
            }
        }
        printf("この数の約数の和mは%d", m);

        //連続する整数なのでnumに+1する
        num2 = num + 1;
        printf("\n連続する整数は%d\n", num2);

        //約数を求める
        printf("連続する数%dの約数は ",num2);
        for (i2 = 1; i2 <= num2; ++i2) {


            if (num2 % i2 == 0) {
                printf("%d ", i2);
                //約数を求めた

                //約数の和を求める
                m2 = m2 + i2;
            }
        }

        printf("この数の約数の和m2は%d\n",m2);
        printf("連続する整数は%d,%dで",num, num2);
        printf("その約数の和は%d,%d\n\n\n", m, m2);

        if (m == m2) {
            while (1) {
                printf("次の組み合わせを探しますか?\n探す場合は1、終了する場合は0を入力してください。\n");
                scanf_s("%d", &answer);

                switch (answer) {

                    case 0: exit(0);

                    case 1: goto next;
                            //次の組み合わせを探すために処理の先頭にジャンプしています
                            break;

                    default:printf("入力された値が不正です。\n");

                }
            }

        }
    }

    return 0;

}

多分、というか絶対慣れてる人から見たら変なことだらけだと思います。ご指摘お待ちしております。

4
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0