このプログラムの・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C言語が苦手な人

このプログラムの・・・

#1

投稿記事 by C言語が苦手な人 » 18年前

#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:このプログラムの・・・

#2

投稿記事 by 管理人 » 18年前

回答が遅くなってしまってすみません(_ _|||)

循環小数の表示方法がわからないのでしょうか?
数学には強くないのではっきりとはいえないですけど、恐らく循環小数の循環する桁は割るほうの桁数に比例刷るんじゃないかと思います。
例えば一桁で割るなら、循環小数で、次に同じ数字が来たらそこまでが循環小数ですよね。
例えば
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 
     ↑          ↑

割る桁数に比例した桁まで調査したら終了すると良いと思います。
 

C言語が苦手な人

Re:このプログラムの・・・

#3

投稿記事 by C言語が苦手な人 » 18年前

回答ありがとうございます。
いろいろ試してるところなので参考にさせていただきます。
またわからないことがありましたら質問させていただくので回答よろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る