初学者です。先生からいただいた問題です。
組み合わせの計算をし、その値を100で割ったときの余りを出すプログラムを作りたいのですが、再帰を使うって入力値を大きくすると、再帰処理の回数が非常に大きくなってしまうのとてつもなく遅くなってしまいます。
またループ処理を使ってみても、調べてみたらオーバーフロー?を起こしてしまいマイナスの値※が出たり、0がでたりしてしまいます。
剰余算をしながら?計算をすると値がオーバーフローを起こさずに表現できると思うのですが,(ex (a+b)% d = a%d + b%dのような感じ)いまいちコードへの表現の仕方わかりません。どのように工夫する必要があるのかご回答いただけたら幸いです。
※
./a.out
123123 12332
-1
c
1#include <stdio.h> 2 3int com(int n, int k){ 4 5 if(k==0 || k==n){ 6 return (1); 7 }else if (k==1){ 8 return (n); 9 }else{ 10 return (com(n-1, k-1) + com(n-1, k)); 11 } 12} 13 14 15 16int main(void){ 17 int n, k; 18 19 scanf("%d %d", &n, &k); 20 printf("%d\n", com(n, k)%100); 21 22 return 0; 23 24}
c
1#include <stdio.h> 2 3int combi(int n, int r) 4{ 5 int i; 6 int k=1; 7 8 for(i=1; i<=r; i++){ 9 k = k*(n-i+1)/i; 10 } 11 12 return k; 13} 14int main() 15{ 16 int n, r; 17 scanf("%d %d", &n, &r); 18 19 printf("%d\n", combi(n, r)%100); 20} 21
何の練習問題かを明記した方が良いと思います。
見てる人にはそれが何の練習問題なのか分かりません。
学校の宿題なのか、友達に出された問題なのか、オンライン上の問題なのか、著書の問題なのか・・・
>>先生からいただいた問題です。
先生に聞きましょう。
https://teratail.com/help/avoid-asking
推奨していない質問
学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
学校の課題というより先生からいただいた大量の練習問題のうちの1つです。先生にはヒントはいただきましたが、ここまでが限界でした。
練習問題ということなのでヒントだけですが、「剰余を求めながら計算する」という考え方は間違っていないです。
ただし、途中に除算が入ると正しく答えが求まらないです。
加算だけで組み合わせの数を求める方法を考える必要があります。
最初のソースコードはおそらく、答えが求まるような気がします。
しかし、質問にも書かれている通り再帰呼び出しが、かなり深くなるので時間がかかりますね。
もしかすれば回答つくかもしれませんが・・・
長い目で見た場合に本人の為にならないという考え方があるのか、テラテイルでは課題の質問には回答がつきにくかったり、そういう質問に回答すると低評価されたりする慣習?のようなものがあるのかもしれません。
いきなり低評価されて驚かれないように質問する時は気をつけた方が良いと思いました。
(テラテイルを利用するのに慣れているようなので余計なお節介だったかもしれませんね)
みなさまありがとうございました。すこし時間をかけて考えてみます。
回答1件
あなたの回答
tips
プレビュー