C言語って… (275レス)
前次1-
抽出解除 レス栞

85
(6): 名前は開発中のものです。 [sage] 02/08/04 18:02 ID:??? AAS
どうしてx^nと謳っておきながら
コードとドキュメントはx^yなの?
記号の不統一性は混乱する元です。

また、場合わけが気持ち悪いですね。
むしろループや再帰を効率的に使ってもっと簡潔に書くべきでは?

ループを使った場合をささっと書くと、

int res=1;
for(int i=0;i<y;++i){
res*=x;
}

て感じ。

ちなみに0^0=1は定義だけど、いいね?
86: 85 [sage] 02/08/04 18:06 ID:??? AAS
あー、ごめん、ちょっと補足。
85のコードはx,yに値が代入された後、場合わけを含めて計算する。
0を入力されても止める必要は無いし、1の場合の場合わけも不要。

考慮していないのは乗数<0の場合。
0で計算される。
88: 85 [sage] 02/08/04 19:03 ID:??? AAS
>>87
えへっ、(省略されました・・全てを読むにはここを押してください)を読まなかったの v
私めんどうくさがりだもん。

…ごめんね。
90: 85 [sage] 02/08/04 19:22 ID:??? AAS
そだね。
87さんのだと最終的な結果がx^(2^y)になるかな?
swapと一緒でtmpが一個いるよ。

tmp無しで書こうと思ったら、church数みたいに

int func(int xx,int yy){return (n==0)?1:xx*func(yy-1);}

とかあらかじめ関数を作っておいて、

printf("%d ^ %d = %d\n",x,y,func(y));

でOK。
しかし再帰でバグ出すと最悪数時間が消えるので、
他にいい方法があったり、あるいは急ぐときにはあんまりお勧めしないです。
91: 85 [sage] 02/08/04 19:23 ID:??? AAS
ああっ、やってしまった…。
訂正です。

int func(int xx,int yy){return (yy==0)?1:(xx*func(xx,yy-1));}

これならうまくいくはず…。たぶん…。
92: 85 [sage] 02/08/04 19:34 ID:??? AAS
やっぱりダメだぁ…。
訂正が面倒だから今回はちゃんとコンパイラ通した。

//再帰を使った階乗計算
#include<stdlib.h>
#include<stdio.h>

int func(int xx,int yy){return (yy==0)?1:(xx*func(xx,yy-1));}

void main(void){
int x,y;

printf("x?");scanf("%d", &x);//xを入力
printf("y?");scanf("%d", &y);//yを入力

printf("%d ^ %d = %d\n",x,y,func(x,y));//計算&結果表示

}
96: 84 [sage] 02/08/04 22:34 ID:??? AAS
>>85 さんご意見ありがとう!
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.714s*