#4
by かずま » 6年前
コード:
#include <stdio.h>
#define SIZE 20 // #define SIZE 1000
int pos[SIZE], quo[SIZE], rem[SIZE], count, max_y;
void recurring(int x, int y)
{
int i = 0, j, k, z = x;
pos[0] = rem[0] = 0;
while (1) {
quo[i++] = z / y; // 商(quotient)を憶えておく
rem[i] = z %= y; // 余り(remainder)を求めて、憶えておく
j = pos[z]; // 余りの位置 (ただし、未初期化の場合あり)
if (j >= 0 && j < i && rem[j] == z) break; // 余りが既出なら抜ける
pos[z] = i; // 余りの位置(position)を憶えておく
z *= 10; // 次の桁の計算に備える
}
k = i - pos[z]; // 循環節の長さ、または循環しない場合の桁数
if (k > count) count = k, max_y = y; // 最大の循環節が見つかった
printf("%4d: %d/%d = %d.", k, x, y, quo[0]);
for (j = 1; j < pos[z]; j++) printf("%d", quo[j]);
if (z) putchar('(');
for (; j < i; j++) printf("%d", quo[j]);
if (z) putchar(')');
putchar('\n');
}
int main(void)
{
for (int n = 1; n <= SIZE; n++) recurring(1, n);
puts("---");
recurring(1, max_y);
return 0;
}
実行結果
コード:
1: 1/1 = 1.
2: 1/2 = 0.5
1: 1/3 = 0.(3)
3: 1/4 = 0.25
2: 1/5 = 0.2
1: 1/6 = 0.1(6)
6: 1/7 = 0.(142857)
4: 1/8 = 0.125
1: 1/9 = 0.(1)
2: 1/10 = 0.1
2: 1/11 = 0.(09)
1: 1/12 = 0.08(3)
6: 1/13 = 0.(076923)
6: 1/14 = 0.0(714285)
1: 1/15 = 0.0(6)
5: 1/16 = 0.0625
16: 1/17 = 0.(0588235294117647)
1: 1/18 = 0.0(5)
18: 1/19 = 0.(052631578947368421)
3: 1/20 = 0.05
---
18: 1/19 = 0.(052631578947368421)
#define SIZE 1000 では、いくつになるでしょうか?
[code=c]
#include <stdio.h>
#define SIZE 20 // #define SIZE 1000
int pos[SIZE], quo[SIZE], rem[SIZE], count, max_y;
void recurring(int x, int y)
{
int i = 0, j, k, z = x;
pos[0] = rem[0] = 0;
while (1) {
quo[i++] = z / y; // 商(quotient)を憶えておく
rem[i] = z %= y; // 余り(remainder)を求めて、憶えておく
j = pos[z]; // 余りの位置 (ただし、未初期化の場合あり)
if (j >= 0 && j < i && rem[j] == z) break; // 余りが既出なら抜ける
pos[z] = i; // 余りの位置(position)を憶えておく
z *= 10; // 次の桁の計算に備える
}
k = i - pos[z]; // 循環節の長さ、または循環しない場合の桁数
if (k > count) count = k, max_y = y; // 最大の循環節が見つかった
printf("%4d: %d/%d = %d.", k, x, y, quo[0]);
for (j = 1; j < pos[z]; j++) printf("%d", quo[j]);
if (z) putchar('(');
for (; j < i; j++) printf("%d", quo[j]);
if (z) putchar(')');
putchar('\n');
}
int main(void)
{
for (int n = 1; n <= SIZE; n++) recurring(1, n);
puts("---");
recurring(1, max_y);
return 0;
}
[/code]
実行結果
[code=text]
1: 1/1 = 1.
2: 1/2 = 0.5
1: 1/3 = 0.(3)
3: 1/4 = 0.25
2: 1/5 = 0.2
1: 1/6 = 0.1(6)
6: 1/7 = 0.(142857)
4: 1/8 = 0.125
1: 1/9 = 0.(1)
2: 1/10 = 0.1
2: 1/11 = 0.(09)
1: 1/12 = 0.08(3)
6: 1/13 = 0.(076923)
6: 1/14 = 0.0(714285)
1: 1/15 = 0.0(6)
5: 1/16 = 0.0625
16: 1/17 = 0.(0588235294117647)
1: 1/18 = 0.0(5)
18: 1/19 = 0.(052631578947368421)
3: 1/20 = 0.05
---
18: 1/19 = 0.(052631578947368421)
[/code]
#define SIZE 1000 では、いくつになるでしょうか?