poj2635 大数模运算

来源:互联网 发布:淘宝帐号出售 编辑:程序博客网 时间:2024/05/23 01:16

这个题的大数处理技巧挺值得学习的。

比如说一个数9876543210097,把它转化为本题所说的千进制就是 th[5]=9,th[4]=876,th[3]=543,th[2]=210,th[1]=097;

然后这个数就变成了千进制的th[5] th[4] th[3] th[2] th[1;

大数处理技巧说完了,也就没什么了,还有一个素数表,我相信,你肯定会!

代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define MAX 1000010using namespace std;int L;char ch[111];int len,klen;int th[50];int u[MAX],su[MAX];void init()  //素数表,su[]记录素数{    int i,j,num=1;    memset(u,1,sizeof(u));    for(i=2;i<=MAX;i++)    {        if(u[i]) su[num++]=i;        for(j=1;j<num;j++)        {            if(i*su[j]>MAX) break;            u[i*su[j]]=0;            if(i%su[j]==0) break;        }    }}void trans()  //将大数转化为千进制。{    int i,j=0;    memset(th,0,sizeof(th));    len=0;    while(ch[j++]) {len++;}    for(i=0;i<len;i++)    {        int k=(len-i+2)/3;        th[k]=th[k]*10+ch[i]-'0';    }    klen=(len+2)/3;}int work(int prime)  //判断素数是否是该大数的因子{    int i,j;    int mod=0;    for(i=klen;i;i--)    {        mod=(mod*1000+th[i])%prime;    }    if(mod)        return 0;    else return 1;}int main(){    int i;    init();    while(cin>>ch>>L&&L)    {        int flag=0;        trans();        for(i=1;su[i]<L;i++)        {            flag=work(su[i]);            if(flag)            {                cout<<"BAD "<<su[i]<<endl;                break;            }        }        if(!flag)            cout<<"GOOD"<<endl;    }    return 0;}


 

0 0
原创粉丝点击