Project Euler 26 Reciprocal cycles( 分数循环节 )


题意:

单位分数指分子为1的分数。分母为2至10的单位分数的十进制表示如下所示: 1/2= 0.5 1/3= 0.(3) 1/4= 0.25 1/5= 0.2 1/6= 0.1(6) 1/7= 0.(142857) 1/8= 0.125 1/9= 0.(1) 1/10= 0.1 这里0.1(6)表示0.166666…,括号内表示有一位循环节。可以看出,1/7有六位循环节。

找出正整数d < 1000,其倒数的十进制表示小数部分有最长的循环节。

思路:

仅供学习


/*************************************************************************
    > File Name: euler026.c
    > Author:    WArobot 
    > Blog:      http://www.cnblogs.com/WArobot/ 
    > Created Time: 2017年06月28日 星期三 15时36分58秒
 ************************************************************************/

#include <stdio.h>
#include <inttypes.h>

#define max(a,b) ((a) > (b) ? (a) : (b))
#define D_MAX 1000
#define MAX_RANGE 1000

int32_t HowManyReciprocalCycles(int32_t n) {
	int32_t rest[MAX_RANGE] = {0};		// 记录商的情况
	int32_t ret = 1 , ind = 1;
	while (rest[ret] == 0 && ret) {		// 如果除数之前没有出现过并且被除数没有除尽
		rest[ret] = ++ind;				// 给出现的除数进行“标记”
		ret *= 10;
		ret %= n;
	}
	return ret ? ind - rest[ret] : 0;
}
int32_t main() {
	int32_t maxLen = 0 , ans = 0;
	for (int32_t i = 2 ; i < D_MAX ; i++) {
		if (maxLen < HowManyReciprocalCycles(i)) {
			maxLen = HowManyReciprocalCycles(i);
			ans = i;
		}
	}
	printf("maxLen = %d\n",HowManyReciprocalCycles(983));
	printf("%d\n",ans);
	return 0;
}
posted @ 2017-06-28 16:13  ojnQ  阅读(477)  评论(0编辑  收藏  举报