个人算法笔记(判断有限小数和循环小数)

仅记录作业过程遇到的值得一记的问题

题干

解题思路

将笔算中竖式除法的每一步分解还原。 基本流程为:m/n得商和余数,再将余数乘以10,作为下一次的除法中的被除数,除以n,以此循环。根据数学知识可知,两整数之商,如果除不尽,将必为有限小数或无限循环小数。所以退出循环的条件某一次除法后为余数为0或者余数循环。 以3/5为例。

步骤 Value 1 3/5=0……3 2 30/5=6……0

此时余数为0,退出循环,0.6为其解,3/5结果是有限小数。 以1/7为例子

步骤 Value 1 1/7=0……1 2 10/7=1……3 3 30/7=4……2 4 20/7=2……6 5 60/7=8……4 6 40/7=5……5 7 50/7=7……1

此时余数与第一位余数相同,且余数开始循环,则循环节为(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;
}

运行结果

经验分享 程序员 微信小程序 职场和发展