宿題が分かりません。助けてください。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ねこ

宿題が分かりません。助けてください。

#1

投稿記事 by ねこ » 17年前

#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:宿題が分かりません。助けてください。

#2

投稿記事 by バグ » 17年前

まず順番に考えてみましょう。

1:任意の値を入力する
2:1で入力された値の階乗を求める
3:2で求められた値が何回2で割り切れるかを求める
4:3で求められた値を画面に出力する

この4段階位に分けると分かり易いでしょうか?
ざっとプログラムを見させてもらいましたが、今は1の段階まではとりあえず問題無いようです。

さて、これから2の段階以降に取り組む訳ですが、どういう事が分からないのでしょうか?

たかぎ

Re:宿題が分かりません。助けてください。

#3

投稿記事 by たかぎ » 17年前

> 2:1で入力された値の階乗を求める
> 3:2で求められた値が何回2で割り切れるかを求める
> 4:3で求められた値を画面に出力する

その方法だと、2の段階ですぐにオーバーフローするのであまりよろしくありません。
そうではなく、1で入力した値を n とすると、

(n 以下の 2 の倍数の数) + (n 以下の 4 の倍数の数) + ... + (n 以下の 2m の倍数の数)

を求めれば、いったん階乗を計算しなくてもよくなります。
質問の中のコードは決して正しくはありませんが、これをやろうとしている形跡があります。

バグ

Re:宿題が分かりません。助けてください。

#4

投稿記事 by バグ » 17年前

あぁ、なるほど、そういう事でしたか(^_^;)
了解です。ご指摘ありがとうございますm(_ _)m

ねこ

返事ありがとう ございました。

#5

投稿記事 by ねこ » 17年前

返事ありがとうございました。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);
}
}
}

バグ

Re:宿題が分かりません。助けてください。

#6

投稿記事 by バグ » 17年前

大サービスでヒントです。
#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:宿題が分かりません。助けてください。

#7

投稿記事 by 通りすがりの者 » 17年前

別の解です。


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

ねこ

教えてくれて、本当にありがとうございました。

#8

投稿記事 by ねこ » 17年前

いろいろありがとうございました。また、質問あったら聞いても、よろしいですか?

フリオ

Re:教えてくれて、本当にありがとうございました。

#9

投稿記事 by フリオ » 17年前

 
 もっと簡単に、これで出来ます。
#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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る