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

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

ただいまの
回答率

90.33%

  • Java

    14461questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • for

    257questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

  • if

    220questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

友愛数を求めたいです。

解決済

回答 4

投稿

  • 評価
  • クリップ 2
  • VIEW 754

ssssa

score 29

Java初心者です。
わからないこと、解決したいこと友愛数を求めたいのですが全く結果が表示されないです。
表示ができるようにしたいです。どなたかご教示お願いいたします。

問題は以下の通りになります。
---------------prob8-14-------------
異なる2つの自然数で、自分自身を除いた約数の和が、互いに他方と等しくなるような数をいう。例えば、220の自分自身を除いた約数は、1,2,4,5,10,11,20,22,44,55,110で、和は284となる。一方、284の自分自身を除いた約数は、1,2,4,71,142で、和は220である。よって、220と284の組み合わせは友愛数という。10000以下の友愛数をすべて求めなさい。

私の書いたコードはこちらになります。

public static void main(String[] args) {
        int n = 0;
        int cn = 0;
        int s = 0;
        int[] x = new int[10000];
        int i = 0;
        for (i = 2; i <= n; i++) {
            if (g(i)) { // これはif(g(i)==true){と同じ。Javaでは式自体が値をもち、正しいときはtrue、正しくないときはfalseの値をもつ。
                x[cn] = s;
                System.out.println(i + " " + s);
                cn++;
            }
        }
    }

    public static boolean g(int a) {
        int i = 0;
        int[] x = new int[10000];
        int cn = 0;
        for (i = 0; i < cn; i++)
            if (x[i] == a)
                return (false);
        int k, w;
        int[] h = new int[10000];
        h[0] = 1;
        k = 1;
        for (i = 2; i <= a / 2; i++) {
            if (a % i == 0) {
                h[k] = i;
                k++;
            }
        }
        int s = 0;
        for (i = 0; i < k; i++)
            s += h[i];
        k = 1;
        if (s == a)
            return (false);
        for (i = 2; i <= s / 2; i++) {
            if (s % i == 0) {
                h[k] = i;
                k++;
            }
        }
        w = 0;
        for (i = 0; i < k; i++)
            w += h[i];
        if (a == w)
            return (true);
        else
            return (false);
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/24 09:56

    質問編集画面タイトル横にある「初心者アイコン」をご活用ください。「初心者」と質問で書くよりも伝わりますし、質問一覧に表示されるのでわかりやすくなります。

    キャンセル

回答 4

+3

mainメソッドで、nが0のままforループに入っているため、一度もループに入れません。
10000までであるならnを10000にするべきでは?

約数の総和を求めるメソッドを他と違えてみた

    public static void main(String[] args) {
        for (int i = 1; i <= 10000; i++) {
            int j = sumOfDivisor(i);
            if (i < j && sumOfDivisor(j) == i) {
                System.out.println(i + " " + j);
            }
        }
    }

    public static int sumOfDivisor(int a) {
        int c = a;
        int sum = 1;

        for (int i = 2; c >= i * i; i++) {
            int multi = 1;
            int tempSum = 1;
            while (c % i == 0) {
                c /= i;
                multi *= i;
                tempSum += multi;
            }
            sum *= tempSum;
        }
        if (c != 1) {
            sum *= 1 + c;
        }
        return sum - a;
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/05 23:11

    お返事が遅れてしまい大変申し訳ございません。
    ソースありがとうございます。
    参考にさせていただきます。
    本当にありがとうございます。

    キャンセル

checkベストアンサー

+2

友愛数を出すためには何度かループ処理が必要となりますね。

  1. まず約数を出す処理を作る
  2. 次に友愛数を出すために、1の約数の総和からその数自身を引いた値を出す
  3. ある数Aに友愛数があるかを導き出す処理を作る→ Aを処理2.で定義した処理にいれ、得られた数をBとし、さらにBを処理2.で定義した処理にいて、得られた数がAと同じこと
  4. Aを2から10000まで繰り返す

これらを一気に作るのではなく、メソッドやクラスに分割すると、わかりやすいかと思います。
参考までに、ソースを以下においてあります。

約数
友愛数

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/05 23:08

    お返事が遅れまして申し訳ございません。
    ソースありがとうございます。
    参考にさせていただきます。

    キャンセル

+1

public class Main {
    public static void main(String[] args){

        for(int num1 = 1; num1 <= 10000; num1++){
            int num2 = sum_divisor(num1);
            if(num1 == sum_divisor(num2) && num2 < num1){
                System.out.println(num2 + " " + num1);
            }
        }  
    }
    public static int sum_divisor(int n)
    {
        int sum = 0;

        for(int i = 1; i < n; i++){
            if(n % i == 0){
                sum += i;
            }
        }
        return sum;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/05 23:08

    お返事が遅れまして申し訳ございません。
    ソースありがとうございます。
    参考にさせていただきます。
    本当にありがとうございます。

    キャンセル

-1

((max)=>{
  // 約数の和を求める
  const ds = function(i){
    let sum = 1;
    for(let n = 2; n <= (i/2); n++){
      sum += (i%n==0)?n:0;
    }
    return sum;
  };
  // maxまでの友愛数を探す
  for(let i = 1; i <=max; i++){
    let d = ds(i);
    if(i >= d){
       // 約数の和が元の数以下の場合は無視
       continue;
    }
    // 友愛数が見つかればconsole出力
    if(i == ds(d)){
      console.log("("+i+","+d+")");
    }
  }
})(10000)

//(220,284)
//(1184,1210)
//(2620,2924)
//(5020,5564)
//(6232,6368)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/05 23:10

    お返事が遅れまして大変申し訳ございません。
    参考ソースありがとうございます。
    参考にさせていただきます。
    本当にありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Java

    14461questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • for

    257questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

  • if

    220questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。