質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

2回答

1617閲覧

友愛数を判定して列挙するプログラムを作りたい

education

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/04/30 03:52

前提・実現したいこと

1から10000までの間に存在する友愛数を列挙するプログラムを作りたいです。大体の形は出来てると思うのですが、思ったような実行結果が得られません。

イメージしている結果としては、「(220:284), (1184:1210), (2620:2924), (5020:5564), (6232:6368)」

という結果を得たいです。(284:220)のようなダブリの結果は得られないようにしたいです。どこを直せばよいか分からないのでアドバイスをお願い致します。

実行結果

友愛数→ (6:6), (28:28), (220:284), (284:220), (496:496), (1184:1210), (1210 :1184), (2620:2924), (2924:2620), (5020:5564), (5564:5020), (6232:6368), (6368:6232), (8128:8128),

該当のソースコード

#include<stdio.h> int main(void) { int i, j; int sum1; int cnt = 0; int k; int l; int sum2; printf("友愛数→ "); for (i = 1; i <= 10000; i++) { sum1 = 0; for (j = 1; j < i; j++) { if (i % j == 0) { sum1 += j; } } k = sum1; sum2 = 0; for (l = 1; l < k; l++) { if (k % l == 0) { sum2 += l; } } if ((i == sum2) && (k == sum1)) { printf("(%d:%d), ", i, k); cnt++; } } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

6:6 や 28:28 のように左右が同じ数値の場合と, 220:284, 284:220 のように左右が逆の場合を除くため, 友愛数判定の if に "i < k" を入れて, 左右が異なることと右が小さい場合を(既に表示済みのはずのため)除くことにします.

c

1#include<stdio.h> 2 3//約数の和 4int sumDivisor(int i) { 5 int j; 6 int sum = 1; 7 8 for (j = 2; j < i; j++) { 9 if (i % j == 0) { 10 sum += j; 11 } 12 } 13 return sum; 14} 15int main(void) { 16 int i, k; 17 int cnt = 0; 18 19 printf("友愛数→ "); 20 for (i = 1; i <= 10000; i++) { 21 k = sumDivisor(i); 22 if (i == sumDivisor(k) && i < k) { 23 printf("(%d:%d), ", i, k); 24 cnt++; 25 } 26 } 27 printf("\n1~10000までに、友愛数は%d組存在しました\n", cnt); 28 return 0; 29}

plain

1友愛数→ (220:284), (1184:1210), (2620:2924), (5020:5564), (6232:6368), 21~10000までに、友愛数は5組存在しました

投稿2020/04/30 04:58

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

#include <stdio.h> int main(void) { int i, j; int k, l, m, n; int sum1; int sum2; int sum3; int cnt1 = 0; int cnt2 = 0; printf("完全数→ "); for (i = 1; i <= 10000; i++) { sum1 = 0; for (j = 1; j < i; j++) { if((i % j) == 0) { sum1 += j; } } if (i == sum1) { printf("%d, ", i); cnt1++; } } printf("\n1~10000までに、完全数は%d個存在しました。", cnt1); printf("\n\n"); printf("友愛数→ "); for (k = 1; k <= 10000; k++) { sum1 = 0; for (l = 1; l < k; l++) { if (k % l == 0) { sum1 += l; } } m = sum1; sum2 = 0; for (n = 1; n < m; n++) { if (m % n == 0) { sum2 += n; } } if ((k == sum2) && (m == sum1) && (k != m) && (k < m)) { printf("(%d:%d), ", k, m); cnt2++; } } printf("\n1~10000までに、友愛数は%d組存在しました\n", cnt2); return 0; }

投稿2020/04/30 04:17

education

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問