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),则
4)a+b≡x+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");
}