• 締切済み

任意多倍長整数演算の問題

任意多倍長整数演算を行う。 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と整数定数を元にして四則演算を用いた式で表せるか。具体的にあらわしてそれが正しいことを示すか、表せないことを示せ。 以上の問題が解けません。 どなたか、解答方法などを教えていただけないでしょうか。

みんなの回答

  • arrysthmia
  • ベストアンサー率38% (442/1154)
回答No.4

おや、どっか違った?

  • arrysthmia
  • ベストアンサー率38% (442/1154)
回答No.3

濃厚なカテ違いの香りが… 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; } とか?

momino
質問者

補足

arrysthmia様 アドバイスありがとうございます。 少し違う感じがしますが、わざわざ回答ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

1: 逆. 「x が 2の倍数」の場合には x から何回 2 を引いても 1 になるはずないので停止しない. もちろんもともと x が負のときにも停止しない. 2: ん? 「x の y乗」をどのように表すんでしょうか? 「x^y」とかければいいけど, これは「四則演算」には入りませんよね.

momino
質問者

補足

Tacosan様 アドバイスありがとうございます。 1) すいません逆でした。。。そこまではだいたい読み取れるのですがその先が分かりませんし、それをどのように証明するかも検討がつかない状態です。 2) 四則演算ではないですが「x^y」も使えるということでお願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

1 は 「f1(x, y) が停止する」 iff 「x = 1」または「f1(x-2, y-1) が停止する」 だから簡単じゃね? 2 は表せないと思う. そもそも四則演算しか使えないとべき乗が表現できないし.

momino
質問者

補足

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

  • 整数問題

    整数問題の解き方を教えてください。 a,b,c を実数の定数としてf( x )= x^3 + ax^2 + bx + cとおくとき、(1)、(2)を示しなさいという問題です。 ⑴ f( - 1 )、f( 0 )、f( 1 ) がすべて整数ならば任意の整数 n に対して f( n ) は整数 ⑵ 連続する 3 つの整数に対して、 f( x ) がすべて整数ならば、任意の整数 n に対して f( n ) は整数

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

  • 条件演算子

    このプログラムをIF文じゃなくて条件演算子を使って書き換えることはできますか? #include <stdio.h> int main(void) { int vx; printf("整数入力しなさい:"); scanf("%d,&vx"); if(vx) puts("その数は非0");   else puts("その数は0"); return(0); }

  • 論理演算の問題です

    論理演算の問題です if( !( a > 0 && b == 0) ) は、 if( a <= 0 || b != 0 ) になりますか? また、 if( !( x > 0 || y < 0 ) は、 if( x <= 0 && y >= 0 ) になりますか? 遅い脳みそで考えました。 このような、論理演算を分かりやすくまとめられたサイトをご存知でしたら、 どなたか教えてください。 お願いします。

  • 整数問題

    実数を係数とするxの多項式f(x)について、すべての整数kに対してf(k)が整数であるための必要十分条件は、 f(0)が整数 かつ すべての整数kについてf(k)-f(k-1)が整数である ことを証明せよ。 この問題でf(x)=ax{n}+bx{n-1}+・・・ とおいてやったのですが できませんでした 他に何か考え方はないでしょうか? 解答の指針を教えてください

  • 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)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • 不等式の問題での最大の整数が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なら理解できるのですが。  問題と解答が誤っているのではと思いますが。  問題集が間違うことも考えられないので、私の整数に関する知識不足また不等式が理解できていないのかと思い質問させていただきました。            

  • 整数問題です。

    整数問題です。 x^2+xy+y^2=34 を満たす正の整数x,yの組はどれか? 因数分解もできませんし、どうやって積一定にしたり、範囲を絞ったりすればいいのか分かりません。それとも、円と反比例のグラフを書いてその格子点を求めるとかそんな感じですか?よろしくお願いします。