【题目】使用数组方法精确计算 M/N (O<MKN100)的值。如果 MN 是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置 (小数位的序号)。 [编程提示]将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第 位存放在第1个元素中,商的第 2 位存放在第 2个元素中,依次类推。 进行除法运算时,每次求出商的第 1位后,将余数乘以 10,再计算商的下一位,重复以上过程,当某次计算后的余数为 0 时,表示 M/N 为有限不循环小数。当某次计算后的余数与前面的某个余数相同时,则 M/N 为无限循环小数,从该余数第一次出现之后所求得的个位数就是小数的循环节。C语言
时间: 2024-03-25 11:38:18 浏览: 123
以下是使用数组方法精确计算 M/N 的代码,其中包括计算循环节的起止位置的逻辑:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000 // 数组最大长度
#define MAXITER 10000 // 最大迭代次数
int main() {
int M, N;
int quotient[MAXN]; // 商
int remainder[MAXN]; // 余数
int iter = 0; // 当前迭代次数
int start, end; // 循环节的起止位置
// 读入 M 和 N
scanf("%d%d", &M, &N);
// 初始化余数
remainder[0] = M % N;
// 计算商和余数
while (remainder[iter] != 0 && iter < MAXITER) {
quotient[iter] = remainder[iter] * 10 / N;
remainder[iter+1] = remainder[iter] * 10 % N;
// 检查是否有循环节
for (int i = 0; i < iter; i++) {
if (remainder[i] == remainder[iter+1]) {
start = i;
end = iter;
goto found_loop; // 跳转到循环节被找到的位置
}
}
iter++;
}
// M/N 是有限不循环小数的情况
if (remainder[iter] == 0) {
printf("%d/%d = ", M, N);
for (int i = 0; i < iter; i++) {
printf("%d", quotient[i]);
}
printf("\n");
}
// M/N 是无限循环小数的情况
else {
found_loop:
printf("%d/%d = ", M, N);
for (int i = 0; i <= start; i++) {
printf("%d", quotient[i]);
}
printf("(");
for (int i = start+1; i <= end; i++) {
printf("%d", quotient[i]);
}
printf(")\n");
printf("循环节起止位置:%d-%d\n", start+1, end);
}
return 0;
}
```
该代码通过循环计算商和余数,并在每次计算后检查余数是否已经出现过。如果余数重复出现,则说明 M/N 是无限循环小数,从该余数第一次出现之后所求得的个位数就是小数的循环节。如果迭代次数超过了 MAXITER,则认为 M/N 是无限循环小数并退出循环。最后根据 M/N 是有限不循环小数还是无限循环小数输出不同的结果。注意代码中使用了 `goto` 语句来实现跳转到循环节被找到的位置。
阅读全文