#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;
}