书上面讲的很好,程序也写得很巧妙。
最主要的一句话:只需要将10k%N的结果与余数信息数组里非空的元素相加,再去模N,看看会不会出现新的余数。
#include <iostream>
#include <vector>
using namespace std;
vector<int> find_number(int N){
vector<vector<int> > BigInt(N);
for (int i = 0; i < N; ++i){
BigInt[i].clear();
}
BigInt[1].push_back(0);
int NoUpdate = 0;
for (int i = 1, j = 10 % N;; ++i, j = (j * 10) % N){
bool flag = false;
if (BigInt[j].size() == 0){
flag = true;
//10^i % N = j
BigInt[j].clear();
BigInt[j].push_back(i);
}
for (int k = 1; k < N; ++k){
//计算 (10^i + BigInt[k] ) % N 的值
if ((BigInt[k].size() > 0) && (i > BigInt[k][BigInt[k].size() - 1]) && (BigInt[(k + j) % N].size() == 0)){
flag = true;
BigInt[(k + j) % N] = BigInt[k];
BigInt[(k + j) % N].push_back(i);
}
}
if (flag == false)
NoUpdate++;
else
NoUpdate = 0;
if (NoUpdate == N || BigInt[0].size() > 0)
break;
}
if (BigInt[0].size() == 0)
return vector<int>();
else
return BigInt[0];
}
int main(){
vector<int> ret = find_number(99);
return 0;
}