No.13782![]() |
プログラム作成 投稿者---☆花音☆(2004/04/27 01:15:41) |
||
1.整数を入力してもらい、その整数の約数の個数を表示するプログラムを作成せよ。(例:12のとき6、18のとき6) 2.整数を入力してもらい、その整数の約数の総和を表示するプログラムを作成せよ。(例:12のとき28、18のとき39) 3.「6」のように自分自身を除く約数の総和が、もとの数と等しくなってしまうものを完全数といいます。 6の約数={1,2,3,6} 6以外の約数の和=1+2+3=6 1000以下の完全数を求めるプログラムを作成しなさい。 (答えは6,28,496の3つです) ※printf,scanfを使うのは基本 unsigned,if else,while,do,forしか習ってないのでこれしか使わない。 主にforで作りたい。 |
No.13783![]() |
Re:プログラム作成 投稿者---とおりすがり(2004/04/27 01:37:12) |
||
で、ご自分の努力の程は? 丸投げですか? |
No.13784![]() |
Re:プログラム作成 投稿者---NykR(2004/04/27 10:57:41) |
||
じゃあ、とりあえず3番だけ。 要求されているのと違うやり方なので、このままでは提出できませんが。 # get_sum_divisorもそのままでは2番の答えに使えません。 #include <stdio.h> typedef unsigned long long ullong; ullong get_sum_divisor(ullong value) { ullong e = value & -value; ullong o = value / e; ullong i, j, sum; for (i = 1, sum = 0; i * i < o; i += 2) { if (o % i) { continue; } for (j = 1; j <= e; j *= 2) { sum += j * (i + o / i); } } return sum - value; } int main(void) { ullong value; for (value = 1; value & 0x000000007fffffff ; value = value << 1 | value << 2 ) { if (value == get_sum_divisor(value)) { printf("%llu\n", value); } } return 0; } |
No.13794![]() |
Re:プログラム作成 投稿者---Alex(2004/04/27 20:43:49) |
||
頭の体操になったので、1番のソースコードを書いておきます。 コメント文はあえて入れていません。それぞれの処理がどのような意味かは、 ご自分で調べてください。 なお、2番の答えは0または、無限大だと思いますし、 3番は前提が間違っているような気がするのは、私の気のせいでしょうか? #include <stdio.h> #include <stdlib.h> int main(void) { int sei,yaku = 1,i; printf("整数を入力してください\n"); scanf("%d",&sei); if(sei == 0) { printf("解は無数に存在します\n"); exit(1); }else if(sei < 0) sei *= -1; for(i = 2; i <= sei / 2; i++) { if(sei % i == 0) yaku++; } yaku++; yaku *= 2; printf("%d の約数の数は %d です\n",sei,yaku); return 0; } 多分、出題者は整数と自然数を間違えているのではないかと。 |
No.13799![]() |
Re:プログラム作成 投稿者---とおりすがり(2004/04/28 02:35:12) |
||
1or-1を入力したら、どうなりますか? |
No.13800![]() |
Re:プログラム作成 投稿者---isshi(2004/04/28 10:44:25) |
||
約数は自然数に対して定義されているのだから、 自然数以外の整数が入力されたらエラーでも出しておけばいいのでは。 |