使用数组方法精确计算 M/N (O<MKN100)的值。如果 MN 是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置 (小数位的序号)。[[编程提示]将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第 位存放在第1个元素中,商的第 2 位存放在第 2个元素中,依次类推。(使用c语言)
时间: 2024-03-17 19:47:16 浏览: 156
好的,我理解了你的问题。这个问题可以使用长除法的方法来解决,将商存放在一维数组中。下面是一个实现该算法的示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1000 // 定义数组最大长度
int main()
{
int M, N, remainder, quotient[MAX_SIZE], digits[MAX_SIZE * 3]; // digits数组存放商的小数位数
int repeat_start = -1, repeat_end = -1; // repeat_start和repeat_end分别表示循环节的起始位置和结束位置
memset(quotient, 0, sizeof(quotient)); // 将商全部初始化为0
memset(digits, -1, sizeof(digits)); // 将digits全部初始化为-1
scanf("%d%d", &M, &N);
// 计算商的整数部分
int integer = M / N;
remainder = M % N;
// 如果余数为0,直接输出商
if (remainder == 0) {
printf("%d\n", integer);
return 0;
}
// 计算商的小数部分
int i = 0;
while (remainder != 0 && i < MAX_SIZE * 3) {
remainder *= 10;
quotient[i] = remainder / N;
remainder = remainder % N;
// 判断是否有循环节
if (digits[remainder] != -1) {
repeat_start = digits[remainder];
repeat_end = i;
break;
}
digits[remainder] = i;
i++;
}
// 输出商的整数部分
printf("%d.", integer);
// 输出商的小数部分
for (int j = 0; j < i; j++) {
if (j == repeat_start) {
printf("(");
}
printf("%d", quotient[j]);
if (j == repeat_end) {
printf(")");
break;
}
}
printf("\n");
// 输出循环节的位置
if (repeat_start != -1) {
printf("repeat from %d to %d\n", repeat_start, repeat_end);
}
return 0;
}
```
这个程序可以读入 M 和 N 的值,然后使用长除法的方法计算出商的整数部分和小数部分。如果小数部分是循环小数,则程序会输出循环节的位置。注意,这个程序中使用了两个数组,一个是 quotient 数组,用来存放商的各个位,另一个是 digits 数组,用来判断是否有循环节。如果 digits[remainder] != -1,则说明已经出现了相同的余数,也就是说有循环节。
阅读全文