51Nod 1035 最长的循环节

正整数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

定理1:如果1≤b < a,a沒有2或5的质因数,并且a与b互质,那么b/a的循环节位数恰好等于: min{e∈N: 10^e≡1(moda)}。

证明过程见相关初等数论的书籍。

#include 

int main(){
    int n,ans,maxx=0;
    scanf("%d",&n);
    for(int i = 2; i <= n; i++)
    {
        int m = 10, cnt = 1, a = i;
        while(a%2 == 0) 
             a /= 2;
        while(a%5 == 0) 
             a /= 5;
        if(a==1)
            cnt = 0;
        else{
            while(m%a != 1)
            {
                m = (m*10)%a;
                cnt++;
            }
        }
        if(cnt >= maxx){
            maxx = cnt;
            ans = i;
        }
    }
    printf("%d\n",ans);
    return 0;
}



你可能感兴趣的:(———数论————)