C言語関係掲示板

過去ログ

No.604.正の偶数nを偶数と奇数の積に分解する

[戻る] [ホームページ]
No.5779

わからないです。
投稿者---シューイン(2003/04/14 01:49:09)


入力した正の偶数nを偶数と奇数の積に分解するプログラムなのですが、例えば720と入力すると720=16*45と表示するようにしたいのです。空欄の?の部分がわかりません。

include<stdio.h>
int main(void){
int e,o,n;

printf("偶数:");
scanf("%d,&n");
========================

?

========================
printf("%d=%d*%d",n,e,o);

return(0);
}

No.5780

Re:わからないです。
投稿者---oioi(2003/04/14 03:09:23)


>空欄の?の部分がわかりません。

?の部分ってほぼ全部じゃん(w 題名も問題だし。
「ご利用上の注意」を読んで下さい。

これだけでは何なので、アドバイスを1つ。まずは具体例で考えてみてはどう?
下の例の場合、どうやって分けるのか「日本語」で考えてみて下さい。
(例1) 6
(例2) 24
(例3) 720
例3は、720=16*45以外に、720=48*15=80*9=144*5=240*3=720*1ってのも題意に
合うと思うんだが、それをどうするのかもね。

No.5787

Re:わからないです。
投稿者---シューイン(2003/04/14 17:49:28)


#include<stdio.h>
int main(void){
int e,o,n;

printf("n:");
scanf("%d,&n");

e=2;
o=n;
while(o%2!=0){
o=o/e;
e+=2;
}
printf("%d=%d*%d",n,e,o);

return(0);
}
こういう風にやりましたが、core dumpedになってしまいます。

No.5790

Re:わからないです。
投稿者---あかま(2003/04/14 18:45:02)


ひたすら2で割っていくのなら

#include<stdio.h>
int main(void){
int e,o,n;

printf("n:");
scanf("%d",&n);

e=1;
o=n;
while(o%2==0){
o=o/2;
e*=2;
}
printf("%d=%d*%d",n,e,o);

return(0);
}


No.5796

Re:わからないです。
投稿者---かずま(2003/04/14 22:13:32)


> ひたすら2で割っていくのなら

今時の CPU は、どれも、int が 2の補数表現なので、2で割らなくて済みます。
    e = -n & n;
    o = n / e;


No.5799

Re:わからないです。
投稿者---あかま(2003/04/15 01:24:25)


ビット演算は面白いですね。知りませんでした。
勉強になります。

No.5800

Re:わからないです。
投稿者---oioi(2003/04/15 03:05:31)


>    e = -n & n;
>    o = n / e;
さすがにいきなり解説なしに見せられても、慣れていない人にはわからないと
思うので、でしゃばりながら、ちょっとだけ説明を^^
-nは2の補数だと、!n + 1 と表現されるので、それとnの論理積を取ると、nを
表現するビットのうち、一番右に立っているビットだけが残ります。
これはつまり、割り切れる最大の"2のべき乗"が得られたことになります。

n==0の時は当然e==0となり、0除算が発生します。要注意。