#include <stdio.h>
まったくの初心者です;;nの階乗が2で何回割り切れるかのプログラムですが、
#include<stdio.h>
main(){
int n,k,sum=0;
printf("自然数を入力しなさい");
scanf("%d",&n);
for(i=0,i<=n,i++){
k=n/2;
sum=sum+k;
k=n;
if(n==1){break;}
printf("2で%d回割り切れる",sum);
}
と入力しましたが、間違ったところいっぱいあると思いますが、教えて欲しいです。お願いします。
宿題が分かりません。助けてください。
Re:宿題が分かりません。助けてください。
まず順番に考えてみましょう。
1:任意の値を入力する
2:1で入力された値の階乗を求める
3:2で求められた値が何回2で割り切れるかを求める
4:3で求められた値を画面に出力する
この4段階位に分けると分かり易いでしょうか?
ざっとプログラムを見させてもらいましたが、今は1の段階まではとりあえず問題無いようです。
さて、これから2の段階以降に取り組む訳ですが、どういう事が分からないのでしょうか?
1:任意の値を入力する
2:1で入力された値の階乗を求める
3:2で求められた値が何回2で割り切れるかを求める
4:3で求められた値を画面に出力する
この4段階位に分けると分かり易いでしょうか?
ざっとプログラムを見させてもらいましたが、今は1の段階まではとりあえず問題無いようです。
さて、これから2の段階以降に取り組む訳ですが、どういう事が分からないのでしょうか?
Re:宿題が分かりません。助けてください。
> 2:1で入力された値の階乗を求める
> 3:2で求められた値が何回2で割り切れるかを求める
> 4:3で求められた値を画面に出力する
その方法だと、2の段階ですぐにオーバーフローするのであまりよろしくありません。
そうではなく、1で入力した値を n とすると、
(n 以下の 2 の倍数の数) + (n 以下の 4 の倍数の数) + ... + (n 以下の 2m の倍数の数)
を求めれば、いったん階乗を計算しなくてもよくなります。
質問の中のコードは決して正しくはありませんが、これをやろうとしている形跡があります。
> 3:2で求められた値が何回2で割り切れるかを求める
> 4:3で求められた値を画面に出力する
その方法だと、2の段階ですぐにオーバーフローするのであまりよろしくありません。
そうではなく、1で入力した値を n とすると、
(n 以下の 2 の倍数の数) + (n 以下の 4 の倍数の数) + ... + (n 以下の 2m の倍数の数)
を求めれば、いったん階乗を計算しなくてもよくなります。
質問の中のコードは決して正しくはありませんが、これをやろうとしている形跡があります。
返事ありがとう ございました。
返事ありがとうございました。nの階乗の値を計算しなくても、できるプログラムです。もう一回考えまして、下のように・・・しかし、また間違いました。繰り返し(つまり、for文)のところはよく分かりません。
#include<stdio.h>
main(){
int n,i,k,sum=0;
printf("自然数を入力しなさい");
scanf("%d",&n);
for(i=0;i<=n;i++){
if(n==1){break;}
if(n>1){
k=n/2;
sum=sum+k;
k=n;
printf("%dは2で%d回割り切れる",n,sum);
}
}
}
#include<stdio.h>
main(){
int n,i,k,sum=0;
printf("自然数を入力しなさい");
scanf("%d",&n);
for(i=0;i<=n;i++){
if(n==1){break;}
if(n>1){
k=n/2;
sum=sum+k;
k=n;
printf("%dは2で%d回割り切れる",n,sum);
}
}
}
Re:宿題が分かりません。助けてください。
大サービスでヒントです。
#include <stdio.h> void main(void) { int i, j, n, cnt = 0; printf("自然数を入力しなさい"); scanf("%d", &n); if (n != 1) { for (j = 2; j <= n; j *= 2) { for (i = j; i <= n; i += j) { /*** ここにある処理を書き込む事で答えが求まります ***/ } } } printf("%dの階乗は2で%d回割り切れる\n", n, cnt); }
Re:宿題が分かりません。助けてください。
別の解です。 #include <stdio.h> int main(void) { int count, n, i, j; do { printf("n=? "); scanf("%d", &n); } while (n < 0); for (count = 0, i = 2; i <= n; i += 2) for (j = i; j % 2 == 0; j /= 2) count++; printf("%dの階乗は、2で%d回割り切れる。\n", n, count); return 0; }
Re:教えてくれて、本当にありがとうございました。
もっと簡単に、これで出来ます。
#include <stdio.h> int main(void) { int n, m, i; scanf("%d", &n); for(m = 0, i = 2; i <= n; i *= 2) m += (n / i); printf("%d\n", m); return 0; }