个人算法笔记(判断有限小数和循环小数)
仅记录作业过程遇到的值得一记的问题
题干
解题思路
将笔算中竖式除法的每一步分解还原。 基本流程为: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; }