个人算法笔记(判断有限小数和循环小数)
仅记录作业过程遇到的值得一记的问题
题干
解题思路
将笔算中竖式除法的每一步分解还原。 基本流程为:m/n得商和余数,再将余数乘以10,作为下一次的除法中的被除数,除以n,以此循环。根据数学知识可知,两整数之商,如果除不尽,将必为有限小数或无限循环小数。所以退出循环的条件某一次除法后为余数为0或者余数循环。 以3/5为例。
此时余数为0,退出循环,0.6为其解,3/5结果是有限小数。 以1/7为例子
此时余数与第一位余数相同,且余数开始循环,则循环节为(142857).
代码
#include<stdio.h>
#define N 1000
int main() {
int i, j, k, start, end;
int m, n;
int div[N], mod[N];
int flag = 0;
scanf("%d %d", &m, &n);
div[0] = m / n;
mod[0] = m % n;
i = 0;
while (flag == 0) {
i += 1;
div[i] = mod[i - 1] * 10 / n;
mod[i] = mod[i - 1] * 10 % n;
if (mod[i] == 0) {
flag = 1;
start = 1;
end = i;
}
else {
for (j = 1; j < i; j++) {
if (mod[i] == mod[j]) {
flag = 2;
start = j;
end = i;
}
}
}
}
if (flag == 1) {
printf("%d.", div[0]);
for (k = start; k <= end; k++) {
printf("%d", div[k]);
}
printf("
");
}
if (flag == 2) {
printf("(");
for (k = start; k < end; k++) {
printf("%d", div[k]);
}
printf(")
");
}
return 0;
}
