其实就是给出一个数k,和一个上界L,找到小于这个上界L的最小的可以被k整除的数!
问题在于大数k,同样只能用高精度来解决了,取模的时候从最高为开始模,然后把余数给下一位加上,再取模!
而这里还用到了压缩的方法,每三个数字作为一个数储存,然后取模的时候也是一样,加余数的时候乘个1000就行了!
1 //sicily 1231 The Embarrassed Cryptography 2 #include3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const int N = 1000000;10 bool a[N+1];11 char k[105];12 int hp[40];13 int thousand[]={ 1,10,100,1000};14 int len;15 16 //求素数(筛选法) 17 void get_prime()18 {19 memset(a,1,sizeof(a));20 for(int i=2; i<=N; i++)21 {22 if(a[i])23 {24 for(int j=2; j*i<=N; j++)25 a[i*j]=0;26 }27 }28 } 29 //高精度,三位三位的分 30 void high_precision() 31 { 32 memset(hp, 0, sizeof(hp)); 33 len=(strlen(k)-1)/3; //注意偶数的时候 34 int klen=strlen(k); 35 for (int i=0; i<=len; i++) 36 { 37 for (int j=1; j<=3 && klen-i*3-j>=0; j++) 38 hp[i]+=thousand[j-1]*(k[klen-i*3-j]-'0'); 39 }40 //for(int i=0; i<=len; i++)41 // cout << hp[i] << " ";42 //cout << endl;43 } 44 //高精度取模 45 int is_mod(int x)46 {47 int c=0;48 for(int i=len; i>=0; i--)49 c=(hp[i]+c*1000)%x;50 return c;51 }52 53 54 int main()55 {56 int l;57 get_prime();58 while(scanf("%s%d", k, &l) && strcmp(k,"0") && l)59 {60 high_precision();61 int ans=0, flag=1; 62 63 for(int i=2; i