ページ 11

繰り返しの問題

Posted: 2007年1月11日(木) 23:17
by たく
課題に詰まって困っているので投稿させていただきます。

 0≦x≦0.5のとき、x=2x
 0.5<x≦1のとき、x=2(1-x)
これを繰り返していって、以前に出たのと同じ答えが出てきたらストップしてその値を返す。(周期を求める感じです。)
という問題を解きたいのですが、正直さっぱりわかりません。
(初期値は0≦x≦1です。)

一応自分で最初の部分を作ってみたのですが、既にこんがらがってきてしまっています。
申し訳ないのですが、手助けしていただけないでしょうか。

#include <stdio.h>
main(){
 double x[100];
 int i=0,j;

 for(x=0;x<1;x+=0.001){
  for(j=0;j<100;j++){
   if(x<=0.5){
    x[i+1]=2*x;
  }else if(x>0.5){
  x[i+1]=2*(1-x);
  }
   i++;
  }
 }
return 0;
}

Re:繰り返しの問題

Posted: 2007年1月11日(木) 23:32
by box
>  0≦x≦0.5のとき、x=2x
>  0.5<x≦1のとき、x=2(1-x)

y=2xと、y=2(1-x)という式が正しいですか?

> これを繰り返していって、以前に出たのと同じ答えが出てきたらストップしてその値を返す。(周期を求める感じです。)

提示されたコードではxを0から0.001刻みで変化させているようですので、
xが0.501(yが0.998)の場合にxが0.499の場合と等しくなります。
そういう答えを求めていますか?

Re:繰り返しの問題

Posted: 2007年1月12日(金) 00:08
by たく
わかりにくくてすみません。
x=2xというのは初期値をx0とすると
 x1=2*x0, x2=2*x1,・・・
という感じでどんどんxを更新していくことを表したかったんです。

例えば初期値を0.12とすると
x=0.12, 0.24, 0.48, 0.96, 0.08, 0.16, 0.32, 0.64, 0.72, 0.56, 0.88, 0.24, 0.48,・・・
と一定の法則みたいなのが現れるじゃないですか。
以前に出たのと同じ答えが出てきたらストップというのは、そういう意味で書きました。
この場合は答えは0.24というふうに表示したいです。

Re:繰り返しの問題

Posted: 2007年1月12日(金) 02:12
by フリオ
 
 これでいいのでしょうか。
#include <stdio.h>

int main(void)
{
    int x, i, j, flag;
    int p[100];
    
    for(x = 0; x <= 1000; x ++){
        p[0] = x;
        for(flag = i = 0; !flag && i < 99; i ++){
            if(p <= 500) p[i + 1] = 2 * p;
            else p[i + 1] = 2 * (1000 - p);
            for(j = 0; j <= i; j ++){
                if(flag = (p[i + 1] == p[j])){
                    printf("%.3f(%.3f) ", p[j] / 1000.0, x / 1000.0);
                    break;
                }
            }
        }
        if((x % 5) == 4) putchar('\n');
    }
    return 0;
}

 

Re:繰り返しの問題

Posted: 2007年1月12日(金) 15:59
by たく
ありがとうございます。非常に助かります。
int型で作った方がわかりやすくていいですね。

自分の能力の低さが申し訳ないのですが、flagの使われ方がいまいちわかりません。
もう少し詳しく教えていただけると嬉しいです。

Re:繰り返しの問題

Posted: 2007年1月24日(水) 23:36
by たく
放置しててすみません。
無事解決しました。
なんとか課題も提出できました。
解答してくださった方、ありがとうございました。