poj2635 大数模运算

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

比如说一个数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 1000010
using 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值