二进制下 求分数化小数的循环节问题

表示还没理解过程,先贴个模版吧,套用在十进制下的求分数化小数的循环节答案不对。

#include <iostream>
#include<cstdio>
using namespace std;

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

int euler(int n)
{
    int phi=n;
    int top=n;
    for(int i=2;i*i<=top;i++)
    {
        if(n%i==0)
        {
            phi=phi/i*(i-1);
            while(n%i==0) n/=i;
        }
    }
    if(n>1) phi=phi/n*(n-1);
    return phi;
}

int pow_mod(__int64 a,__int64 b,__int64 n)
{
    __int64 t=1;
    a%=n;
    while(b)
    {
        if(b&1) t=t*a%n;
        a=a*a%n;
        b>>=1;
    }
    return t;
}

int main()
{
    int n,m,d,t,ans1,ans2,phi,i,Case=0;
    char ch;
    while(~scanf("%d%c%d",&n,&ch,&m))
    {
        Case++;
        d=gcd(n,m);
        n/=d;m/=d;t=0;
        while(m%2==0)
            t++,m>>=1;
        ans1=t+1;
        phi=euler(m);
        ans2=phi;
        for(i=2;i*i<phi;i++)
        {
            if(phi%i) continue;
            d=pow_mod(2,i,m);
            if(d==1 && ans2>i) ans2=i;
            d=pow_mod(2,phi/i,m);
            if(d==1 && ans2>phi/i) ans2=phi/i;
        }
        printf("Case #%d: %d,%d\n",Case,ans1,ans2);
    }
    return 0;
}

 

posted on 2013-08-08 11:10  雄..  阅读(439)  评论(0)    收藏  举报

导航