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*/ |