poj 2635 高精度取模

给出一个大整数10^100 KEY,这个数是两个素数的积,然后给出一个数L,如果KEY存在小于L的素数,则返回false,并输出这个最小的素数,如果大于等于L,则输出true。

由于L并不是很大,我们先将素数表打出来,利用大整数取模运算来计算是否存在小于L的素数,由于KEY比较大,我们先转化成大进制数加快运算

#include <iostream>
#include <stdio.h>
using namespace std;
const int N=101;
const int MAXN=1000010;
char str[N];
bool isPrim[MAXN];
int key[N],L,prime[MAXN],data[N];

//打表
void initPrime()
{
    int i,k;
    memset(isPrim,0,sizeof(isPrim));
    isPrim[0]=0;
    isPrim[1]=0;
    k=0;
    for(i=2;i<MAXN;i++)
    {
        if(!isPrim[i])
        {
            prime[k++]=i;
            int j=2;
            while(i*j<MAXN)
            {
                isPrim[i*j]=1;
                j++;   
            }
        }
    }
}

//转化为大进zhi数
int converse(char *a,int len)
{
    int i,j,l,k;
    if(0 == len%3)
        l=len/3;
    else
        l=len/3+1;
    k=l;
    int tmp=1;
    for(j=len-1;j>=0;j-=3)
    {
        l--;
        data[l]=0;
        tmp=1;
       
        for(i=j;i>=(j-2) && i>=0;i--)
        {
            data[l]+=(a[i]-'0')*tmp;
            tmp*=10;
        }
    }
    return k;
}

//同余取模
bool div(int *a,int t,int len)
{
    int result=0;
    for(int i=0;i<len;i++)
    {
        result=(result*1000+a[i])%t;
    }
    if(result)
        return false;
    return true;
}
int main()
{
    int j,len;
    initPrime();
    while(1)
    {
        memset(str,'\0',sizeof(str));
        scanf("%s%d",str,&L);
        if(0 == L)
            break;
        len=strlen(str);
        len=converse(str,len);
        bool flag=true;
        for(j=0;prime[j]<L;j++)
        {
            if(div(data,prime[j],len))
            {
                flag=false;
                break;
            }
        }
        if(!flag)
            printf("BAD %d\n",prime[j]);
        else
            printf("GOOD\n");
    }
    return 0;
}

posted on 2011-09-04 15:42  buptLizer  阅读(1164)  评论(0编辑  收藏  举报

导航