您的位置:首页 > 其它

pku 2635 The Embarrassed Cryptographer(质数表,高精度)

2009-08-10 21:51 375 查看
自己写的,留着以后做求质数表的和高精度除法的模板。

#include "math.h"
#include <iostream>
using namespace std;
int K[35],K_index,L;
bool isprime[1000005];
void prime(bool a[],int max_n)//生成质数表
{
memset(a,1,sizeof(bool)*max_n);//初始化参数数组,要特别小心    我一开始直接用memset(a,1,sizeof(a)),是错的
a[0]=a[1]=false;
int sq=sqrt((double)max_n);
for(int i=2;i<=sq;i++)
{
if(a[i])
{
for(int j=i*i;j<=max_n;j+=i)
{
a[j]=false;
}

}
}
}
int divid(int t,int* big_num,int end)//高精度除法,返回余数  这里是1000进制
{
int left=0;
for(int i=0;i<end;i++)
{
left=left*1000+big_num[i];
left=left%t;
}
return left;
}
int translate(char *str,int* int_array)//输入字符串,转换成int[]存储的大数,这里用的1000进制,返回int[]末端的index
{
int len=strlen(str);
int k,temp,K_index;
k=len%3;
K_index=temp=0;
for(int i=0;i<k;i++)
{
temp=temp*10;
temp+=str[i]-'0';
}
if(temp) int_array[K_index++]=temp;
for(int i=k;i<len;i=i+3)
{
temp=0;
for(int j=0;j<3;j++)
{
temp=temp*10;
temp+=str[i+j]-'0';
}
int_array[K_index++]=temp;
}
return K_index;
}
int main()
{
prime(isprime,1000005);
char temp[105];
while(scanf("%s%d",temp,&L)&&L)
{
int K_end=translate(temp,K);
int dd;
for(dd=2;dd<L;dd++)
{
if(isprime[dd]&&!divid(dd,K,K_end)) break;
}
if(dd>=L) printf("GOOD/n");
else printf("BAD %d/n",dd);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储