p157有这样一段话,表2-1计算110 % 3是多余的。原因是1和10对3的余数相同,所以101和110对3的余数相同,那么只需要判断101是否可以整除3就可以了,而不用判断110是否能整除3。
110=100+10,101=100+1
根据同余定律
如果a≡x(mod d),b≡m(mod d),则
即1≡10(mod 3),100≡100(mod3)
则100+10≡100+1(mod 3)
p157所说的搜索X有K+1位的情况,X=10^K+Y,这里的Y因为只搜索K+1位为1的情况,所以 最大值为10^k-1+10^k,因此 0 <Y<10^k
而文中所说的最简单的方法,搜索空间有2^K-1个数据,因为后K位只有0,1的数有2^k排列,K+1位数必为1因此搜索空间有2^K-1(除去已搜索的X=10^k的情况)
p158if块中的代码是由X%N的已知值算出(10*x)%N的已知值
#include<vector> #include<iostream> #include<cmath> using namespace std; const int N=3; void search(){ vector<vector<int>> v; vector<int> temp; temp.clear(); int i,j,k; int number=0; for(i=0;i<N;i++) { v.push_back(temp); } v[1].push_back(0); int NoUpdate=0; for(i=1,j=10%N;;i++,j=(j*10)%N) { bool flag=false; if(v[j].empty()) { flag=true; //v[j]代表的整数为10^i,10^i%N=j v[j].push_back(i); } for(k=1;k<N;k++) { if( (!v[k].empty())&& (i>v[k][v[k].size()-1])&& (v[(k+j)%N].empty()) ) { flag=true; v[(k+j)%N]=v[k]; v[(k+j)%N].push_back(i); } } if(!flag) NoUpdate++; else NoUpdate=0; //如果经过一个循环节都没能对BigInt进行更新,就是无解 //如果v[0].empty不为空,已经找到解 if(NoUpdate==N||(!v[0].empty())) break; } if(v[0].empty()) cout<<"No number matched the condition is found"<<endl; else{ vector<int> ::iterator iter; for(iter=v[0].begin();iter!=v[0].end();iter++){ number+=pow(10.0,*iter); } cout<<"the number is "<<number<<endl; } } int main(){ search(); system("pause"); }