C言語関係掲示板

過去ログ

No.1298 自然数nを読み込んでその約数の和を出すプログラム

[戻る] [ホームページ]
No.17374

関数型のプログラム
投稿者---かなみ(2004/10/18 21:54:23)


自然数nを読み込んでその約数の和を出すプログラムを作りたいのですが、エラーが出てしまいます。どこが間違っているのでしょうか?

#include <stdio.h>
int s_div(int n);
int main(void)
{
int n;
scanf("%d",&n);

printf("%d\n",s_div(n));

}
int s_div (int n)
{
int s=0,i;

for (i=1;1<=n;i++)
if(n%i==0)
s+=i;
return(s);
}


No.17375

Re:関数型のプログラム
投稿者---ぽこ(2004/10/18 22:56:16)


>自然数nを読み込んでその約数の和を出すプログラムを作りたいのですが、エラーが出てしまいます。どこが間違っているのでしょうか?

情報不足です。エラーとは何でしょうか?
 ・コンパイルエラー?
 ・実行時エラー?
 ・自分の予想通りに動かない?

#ぱっと見、for文の継続条件が激しく怪しそうですが。。



No.17376

Re:関数型のプログラム
投稿者---RAPT(2004/10/18 23:01:11)


n が1以上だったら無限ループですな。


No.17378

Re:関数型のプログラム
投稿者---かなみ(2004/10/18 23:39:55)


コンパイル時に警告が1出ます。
「関数に戻り値の型が指定されていません。戻り値を void 型と見なします。」
と出ています。どう直せばいいのでしょうか?


No.17380

Re:関数型のプログラム
投稿者---kiath(2004/10/18 23:50:35)


>コンパイル時に警告が1出ます。
>「関数に戻り値の型が指定されていません。戻り値を void 型と見なします。」
>と出ています。どう直せばいいのでしょうか?

main関数の最後にreturn 0; を加える。


No.17414

Re:関数型のプログラム
投稿者---かなみ(2004/10/19 22:32:50)


>>コンパイル時に警告が1出ます。
>>「関数に戻り値の型が指定されていません。戻り値を void 型と見なします。」
>>と出ています。どう直せばいいのでしょうか?
>
>main関数の最後にreturn 0; を加える。

ありがとうございます。エラーはなくなったんですが、数字を入力してエンターを押しても何も起こらないのですが・・プログラムが間違っていますでしょうか?



No.17419

Re:関数型のプログラム
投稿者---もぐりん(2004/10/20 08:46:29)


以下のソースで動きました。
for文の使い方を見直しましょう。

#include <stdio.h>

int s_div(int n);

int main(void)
{
    int n;

    printf("数字を入力してください:");
    scanf("%d",&n);
    printf("約数の和は%dです\n",s_div(n));
    return 0;
}

int s_div (int n)
{
    int s=0,i;

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




No.17423

Re:関数型のプログラム
投稿者---かなみ(2004/10/20 17:34:48)


ありがとうございます。例えば、このプログラムを動かして、約数の和が入力値の2倍になるような数字を返すプログラムを作ろうとするにはどうしたらいいのでしょうか?(例えば、6と入力したら12と返ってくるようなもので、入力値が10000以下とかいうもの)


No.17424

Re:関数型のプログラム
投稿者---REE(2004/10/20 17:54:25)


「このプログラムを動かして」ということは、このプログラムを呼び出す
別のプログラムを作成するのですか?

あなたはどうすればいいと思いますか?
それとも想像も付かないのでしょうか?



No.17427

Re:関数型のプログラム
投稿者---かなみ(2004/10/21 11:09:47)


>「このプログラムを動かして」ということは、このプログラムを呼び出す
>別のプログラムを作成するのですか?
>
>あなたはどうすればいいと思いますか?
>それとも想像も付かないのでしょうか?

#include <stdio.h>

int s_div(int n);

int main(void)
{
int n;

printf("数字を入力してください:");
scanf("%d",&n);
printf("約数の和は%dです\n",s_div(n));
return 0;
}

int s_div (int n)
{
int s=0,i;

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


別のプログラムを呼び出してではなく、このプログラムに追加や変更して約数の和が入力した値の2倍の数のみが返されるようなプログラムはどうしたらいいのかと思いまして。上記のプログラムは入力した値の約数の和を返すのみのプログラムですので、例えば入力値が10000までの間で、返ってくる約数の和の値がもとの数の2倍になっているものを返すプログラムにしたいのですが。


No.17428

Re:関数型のプログラム
投稿者---ぽこ(2004/10/21 11:15:59)


>上記のプログラムは入力した値の約数の和を返すのみのプログラムですの
>で、例えば入力値が10000までの間で、返ってくる約数の和の値がもとの数
>の2倍になっているものを返すプログラムにしたいのですが。

これじゃ駄目なのかな?
printf("約数の和は%dです\n",s_div(n));

printf("約数の和の2倍は%dです\n",s_div(n)*2);



No.17435

Re:関数型のプログラム
投稿者---かなみ(2004/10/21 20:07:26)


>>上記のプログラムは入力した値の約数の和を返すのみのプログラムですの
>>で、例えば入力値が10000までの間で、返ってくる約数の和の値がもとの数
>>の2倍になっているものを返すプログラムにしたいのですが。
>
>これじゃ駄目なのかな?
>printf("約数の和は%dです\n",s_div(n));
>↓
>printf("約数の和の2倍は%dです\n",s_div(n)*2);


ダメとかではないんですが・・それは約数の和を2倍にしただけですよね?それはわかるんですが、約数の和が二倍になるものをいっせいに表示してみたいのですが。6から始まってズラット1000までとか、10000までとか制限をつけて。どなたかわかりませんでしょうか?


No.17436

Re:関数型のプログラム
投稿者---REE(2004/10/21 20:13:27)


>ダメとかではないんですが・・それは約数の和を2倍にしただけですよね?それはわかるんですが、約数の和が二倍になるものをいっせいに表示してみたいのですが。6から始まってズラット1000までとか、10000までとか制限をつけて。どなたかわかりませんでしょうか?

分かるかどうかと言われれば分かります。
但し、そのまま答えを教える気はありません。
あなたは自分でプログラムを作る気はないのですか?



No.17437

Re:関数型のプログラム
投稿者---ぽこ(2004/10/21 21:13:48)


>それはわかるんですが、約数の和が二倍になるものをいっせいに表示して
>みたいのですが。6から始まってズラット1000までとか、10000までとか制
>限をつけて。どなたかわかりませんでしょうか?

失礼。問題読み違えてました。
for文で回して条件満たすものだけ表示すれば良いだけかと。
3〜5行ほどの追加/変更ですね。



No.17438

Re:関数型のプログラム
投稿者---かなみ(2004/10/21 22:15:06)


>失礼。問題読み違えてました。
>for文で回して条件満たすものだけ表示すれば良いだけかと。
>3〜5行ほどの追加/変更ですね。

約数の和を関数型で表示するところまではなんとかできたんですけどね。
約数の和がもとの数の2倍になるものだけ表示できたら面白いなと思っただけですので。



No.17439

Re:関数型のプログラム
投稿者---goo(2004/10/21 22:57:21)


要するにこういうことでしょ
#include <stdio.h>


int s_div(int n);

int main(void)
{
    int i;
    for(i=1;i<=10000;i++)
    {
        if(s_div(i)==i*2)
            printf("%d\n",i);
    }
}

int s_div (int n)
{
    int s=0,i;

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





No.17442

Re:関数型のプログラム
投稿者---かなみ(2004/10/21 23:38:58)


>要するにこういうことでしょ
><pre>#include <stdio.h>


int s_div(int n);

int main(void)
{
int i;
for(i=1;i<=10000;i++)
{
if(s_div(i)==i*2)
printf("%d\n",i);
}
}

int s_div (int n)
{
int s=0,i;

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


</pre>


ありがとうございます。今、自分でfor文で考えていたのですが、

if(s_div(i)==i*2)

のようなif文の中身をどう書いたらいいのか悩んでいました。
私もほとんど同じfor文を書いていたのですが、何回コンパイルしてもエラーが出るので何でかわからなかったんですが、i*2と書かないといけないところを2iとしてしまっていたためでした。

「2i」のような書き方はダメなのでしょうか?




No.17443

Re:関数型のプログラム
投稿者---RAPT(2004/10/22 00:13:11)


「2i」のような書き方はダメなのでしょうか?
ダメです。2 * i のように「式」にする必要があります。
i2 とか書くと変数名として処理されます。
2i は識別子として認められません。



No.17430

Re:関数型のプログラム
投稿者---REE(2004/10/21 16:20:24)


>別のプログラムを呼び出してではなく、このプログラムに追加や変更して約数の和が入力した値の2倍の数のみが返されるようなプログラムはどうしたらいいのかと思いまして。上記のプログラムは入力した値の約数の和を返すのみのプログラムですので、例えば入力値が10000までの間で、返ってくる約数の和の値がもとの数の2倍になっているものを返すプログラムにしたいのですが。

その考え方は間違っていないと思いますので、そのように作ってください。



No.17425

Re:関数型のプログラム
投稿者---hermit(2004/10/20 21:46:38)


この間からやってたやつが残ってたので、
アップしときます。
適当に自分のプログラムに組み込んでみてください。

#include <stdio.h>
#include <stdlib.h>
#define TEST

unsigned add_abb(unsigned data) {
    unsigned i, ans=1,p=2;
    if (data%p==0) {
        unsigned add = 1, mult = 1;
        do {mult *= p;
            add  += mult;
            data /= p;
        } while (data%p==0);
        ans *= add;
    }
    for (p=3; p*p <= data; p+=2) {
        if (data%p==0) {
            unsigned add = 1,mult = 1;
            do {mult *= p;
                add  += mult;
                data /= p;
            } while (data%p==0);
            ans *= add;
        }
    }
    if (data!=1) {
        ans *= (1+data);
    }
    return ans;
}

#ifdef TEST
int main()
{
    unsigned n;
    for (n = 2;n < 100000000;n++) {
        unsigned m;
        m = add_abb(n);
        if ( n*2 == m)
            printf("%d->%d =>完全数\n",n,m);
        else if ( n*3 == m)
            printf("%d->%d =>2倍完全数\n",n,m);
        else if ( n*4 == m)
            printf("%d->%d =>3倍完全数\n",n,m);
        else if ( n*5 == m)
            printf("%d->%d =>4倍完全数\n",n,m);
        else if ( n*5 < m)
            printf("%d->%d =>4倍以上\n",n,m);

    }
    printf("End\n");
    getchar();
    return 0;
}
#endif /*TEST*/