51nod-【1035 最长的循环节】

1035 最长的循环节
基准时间限制:1 秒 空间限制:131072 KB 分值: 20  难度:3级算法题
 收藏
 关注
正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数。

1/6= 0.1(6) 循环节长度为1
1/7= 0.(142857) 循环节长度为6
1/9= 0.(1)  循环节长度为1
Input
输入n(10 <= n <= 1000)
Output
输出<=n的数中倒数循环节长度最长的那个数
Input示例
10
Output示例

7

循环节:主要有2个定理:
1、1<=b 这里的a需要把里面2,5这2个因子剔除
为什么是这样呢?其实他是有规律的a,b是互质的
举个栗子:1/7,2/7,3/7,4/7,5/7;他们的循环节的长度都是一样的
所以我们只需要求出1/7的循环节就行了;当然求循环节就是模拟
除法 
定理2:如果1<=b 那么b/a 的循环节位数必整除欧拉函数(a) 

#include

int main()
{
	int n,i,sum=0,ans;
	scanf("%d",&n); 
	for(i=2;i<=n;++i)
	{
		int temp=i;
		while(temp%2==0)
			temp/=2;
		while(temp%5==0)
			temp/=5;
		int g=1,tsum=0;
		if(temp==1)
			tsum=1;
		else
		{
			do
			{
				g*=10;
				g%=temp;
				++tsum;
			}while(g!=1); 
		} 
		if(tsum>sum)
		{
			sum=tsum;
			ans=i;
		} 
	} 
	printf("%d\n",ans); 
	return 0;
}


你可能感兴趣的:(基础数学,51NOD)