- 締切済み
任意多倍長整数演算の問題
任意多倍長整数演算を行う。 int f1 ( int x , y ) { if (x == 1 ) return ( x + y ); return ( f1 ( x - 2 , y - 1 ) * 2 ); } 1) f1の停止する範囲を求め、その範囲で停止することを証明せよ。 2) 1)の範囲で、f1 ( x 、y ) の値をx、yと整数定数を元にして四則演算を用いた式で表せるか。具体的にあらわしてそれが正しいことを示すか、表せないことを示せ。 以上の問題が解けません。 どなたか、解答方法などを教えていただけないでしょうか。
- momino
- お礼率20% (1/5)
- 数学・算数
- 回答数4
- ありがとう数0
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- arrysthmia
- ベストアンサー率38% (442/1154)
おや、どっか違った?
- arrysthmia
- ベストアンサー率38% (442/1154)
濃厚なカテ違いの香りが… a の b 乗を pow(a, b) と書くとすれば、 f1(x,y) の値は、(y - (x-3)/2) * pow(2, (x-1)/2) かな。 Cプログラムなら、(y - x/2 - 1) * (int)(pow(2, x/2) + 0.01) というか、(y - x/2 - 1) * (1 << x/2) なんだろうけれども。 効率は度外視して、再帰処理のデモとして書くならば、 停止性に配慮して、 int f1(int x , y){ int value; if (x > 1) value = f1(x - 2, y - 1) * 2; else if (x = = 1) value = x + y; else /* エラー処理 */ ; return value; } とか?
- Tacosan
- ベストアンサー率23% (3656/15482)
1: 逆. 「x が 2の倍数」の場合には x から何回 2 を引いても 1 になるはずないので停止しない. もちろんもともと x が負のときにも停止しない. 2: ん? 「x の y乗」をどのように表すんでしょうか? 「x^y」とかければいいけど, これは「四則演算」には入りませんよね.
補足
Tacosan様 アドバイスありがとうございます。 1) すいません逆でした。。。そこまではだいたい読み取れるのですがその先が分かりませんし、それをどのように証明するかも検討がつかない状態です。 2) 四則演算ではないですが「x^y」も使えるということでお願いいたします。
- Tacosan
- ベストアンサー率23% (3656/15482)
1 は 「f1(x, y) が停止する」 iff 「x = 1」または「f1(x-2, y-1) が停止する」 だから簡単じゃね? 2 は表せないと思う. そもそも四則演算しか使えないとべき乗が表現できないし.
補足
Tacosan様 アドバイスありがとうございます。 1)ですが、僕の勉強不足だと思うのですがわかりません。。。 問題を見たところxが2の倍数でないと、永遠ループすると思うのですけど どうなのでしょうか? 2)ですが、べき乗に関してですが使えます。 おそらく2は表せるのでしょうか?
関連するQ&A
- 3つの整数が等しいかどうか調べるプログラム
3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }
- ベストアンサー
- C・C++・C#
- PHPの四則演算について
整数が代入される変数が5つ($a $b $c $d $e $f)あります。 整数の範囲はそれぞれの変数でバラバラです。 $aが1から10まで $bが1から200まで $cが1から50まで といった具合です。 PHPで全ての変数を四則演算して1から46の範囲に収めたいと思っています。 いったいどのような数式にしたら良いのでしょうか?
- ベストアンサー
- PHP
- 関数による四則演算でのエラー
expected ')' before 'kakeru' とエラーが出ます。インデントも)も同じ数にしているのですが 30~1時間くらいやってるのですがわかりません 後ろから演算させるようにしたほうがいいのでしょうか。 ((3+4)*3)/7-2 の計算をするようにプログラムを関数を使用し書け。 include <stdio.h> int tasu(int,int); int kakeru(int,int); int waru(int,int); int hiku(int,int); int main() { /* ((3+4)*3)/7-2 */ printf("%d = 1\n",(tasu(3,4)kakeru(1,3)waru(21,7)hiku(3,2))); return 0; } int tasu(int x, int y) { return x+y; } int kakeru(int x, int y) { return x*y; } int waru(int x, int y) { return x/y; } int hiku(int x, int y) { return x-y; }
- ベストアンサー
- C・C++・C#
- C言語のプログラムについて質問
明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) { if (x > y) return (x); else return (y); } int main(void) { int na, nb; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &na); printf("整数1:"); scanf("%d", &na); printf("大きいほうの値は%dです。\n", maxof(na, nb)); return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) { return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) { if (w > x) return (w); else return (x); } maxof(y, z) { if(y > z) return (y); else return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x) return (w); if (w < x) return (x); if (y > z) return (y); if (y < z) return (z); if (maxof(w, x) > maxof(y, z)) return (maxof(w, x)); if (maxof(w, x) < maxof(y, z)) return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。
- ベストアンサー
- C・C++・C#
- 不等式の問題での最大の整数が6とは?
子どもの問題集でわからないと子どもに質問されたのですが 不等式5(x-1)<2(2x+a)を満たすXのうちで最大の整数が6であるとき、定数aの値の範囲を求めるという問題で 解答は5X-5<4X+2を移項し X<2a+5 最大の整数が6である条件は6<2a+5=<7から1<2a=<2 よって1/2<a=<1となっています。 なぜ7という数値がでてくるのかまた7には=が含まれるのかがわかりません。 6<2a+5より 1/2<aなら理解できるのですが。 問題と解答が誤っているのではと思いますが。 問題集が間違うことも考えられないので、私の整数に関する知識不足また不等式が理解できていないのかと思い質問させていただきました。
- 締切済み
- 数学・算数
補足
arrysthmia様 アドバイスありがとうございます。 少し違う感じがしますが、わざわざ回答ありがとうございます。