ページ 1 / 1
このプログラムの・・・
Posted: 2007年6月27日(水) 21:29
by C言語が苦手な人
#include <stdio.h>
main(void) {
int n, amari, x, i, m, y, h;
int a[100];
printf("N ha?");
scanf("%d", &n);
x = 1;
a[x] = amari;
amari = x % n; // amari 余りを計算
printf("%d.", x / n); // x÷n 商を表示
for(i = 0; i <= 1000; i++) {
for(y = i;y >= 0;y--){
if(a[y] == amari){
h = 1;
break;
}
}
if(amari==0){
printf("%d", x/n);
break;
}
else if(h == 1){
break;
}
else{
printf("%d", x/n);
}
x = amari * 10; // x←amari×10
amari = x % n; // amari 余りを計算
}
return 0;
}
これは、数値を入力してもらい、その値で1を割り逆数を計算して、割り切れるか循環するかを判断し、割り切れたら結果を表示し、循環なら循環節を表示させるプログラムを作っているのですが、計算してみると割り切れるほうはちゃんと計算されるのですが、循環のほうが循環節の途中で切れたり、余分に表示されたりします。いろいろいじってみたのですがわからないので、どなたかわかる方回答よろしくお願い致します。
※プログラムのつくりなどでわからない点などありましたら出来る限りお答えしますのでよろしくお願いします。
Re:このプログラムの・・・
Posted: 2007年7月01日(日) 12:48
by 管理人
回答が遅くなってしまってすみません(_ _|||)
循環小数の表示方法がわからないのでしょうか?
数学には強くないのではっきりとはいえないですけど、恐らく循環小数の循環する桁は割るほうの桁数に比例刷るんじゃないかと思います。
例えば一桁で割るなら、循環小数で、次に同じ数字が来たらそこまでが循環小数ですよね。
例えば
1割る7のとき、割るほうは一桁です。
0.
142857142857142857....
このように、1/10の位が1であり、次に1が出てきたところまでが循環小数です。
しかし1/6のように
0.1666666...
という場合もあり、1/100の位から循環する事もあるので注意が必要です。
この位も割るほうの桁数に比例するように思います。
一桁の数字で割っているということは、最大でも10桁の循環小数にしかならないはずです。
この要領で、
1/ 253の場合
0.
003952569169960474308300395256916996047430830039525691699604743083......
答えはこうなります。循環小数の中に同じ数字が何度か出てきますけど、そこまでが循環小数ではないですよね。
今回割る数字が多かったので、循環小数も桁が多くなったのだと思います。
各桁は文字列として格納しておけば比較がしやすいと思います。
0. 1 4 2 8 5 7 1 4 2 8
↑ ↑
同じ数字が出てきたところを発見し、そこから一つずつずらしてパターンを比較してみてはいかがでしょうか。
0. 1 4 2 8 5 7 1 4 2 8
↑ ↑
0. 1 4 2 8 5 7 1 4 2 8
↑ ↑
0. 1 4 2 8 5 7 1 4 2 8
↑ ↑
割る桁数に比例した桁まで調査したら終了すると良いと思います。
Re:このプログラムの・・・
Posted: 2007年7月01日(日) 16:15
by C言語が苦手な人
回答ありがとうございます。
いろいろ試してるところなので参考にさせていただきます。
またわからないことがありましたら質問させていただくので回答よろしくお願いします。