编程之美2.8找符合条件的整数


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的已知值

编程之美2.8找符合条件的整数_第1张图片



#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");
}




你可能感兴趣的:(编程之美2.8找符合条件的整数)