任意一正整数 N,求一个最小的正整数 M(M > 1),使得 N * M 的十进制表示式里只有 1 和 0 .
分析:
对于正整数 N = 7 ,只需依次取值如 X
X 1 10 100 1000
mod N 1 3 2 6
因此,6 + 1 首先得 7,则最小值是 1000 + 1 .
代码(待优化):
#include <iostream>
#include <cmath>
using namespace std;
const unsigned long long maxNum = 0x8000000000000000;
unsigned long long mode[20] = {0}; /* 能保存最大为1e+19 */
unsigned long long POW10(int a){
if(a < 0) return 0;
if(a == 0) return 1;
unsigned long long valTemp = 10, result = 1;
while(a > 0){
if(a &= 0x1)
result *= valTemp;
valTemp *= valTemp;
a >>= 1;
}
return result;
}
unsigned long long findMultiply(unsigned long long N)
{
if(N <= 0) return 0;
if(N == 1) return 1;
unsigned long long result = 0;
unsigned long long currentval = 1;
short i = 0;
/* for(; i < 20; ++i) */
for(; currentval < maxNum; currentval *= 10){ /* 最多 19 次*/
mode[i] = currentval % N;
if(mode[i] == 0){
result = currentval;
return result;
}
else{
for(short r = 1; r <= i; ++r){
for(short start = 0; start < i; ++start){
unsigned long long sumMode = mode[i];
result = currentval;
short begin = start;
short len = r;
while(begin < i && len > 0){
sumMode += mode[begin];
result += POW10(begin);
if(sumMode == N)
return result;
++begin;
--len;
}
}
}
}
++i;
}
return 0;
}
int main(){
unsigned long long N = 0;
while(cin >> N) {
unsigned long long result = findMultiply(N);
if (result == 0)
cout << "Not exist!" <<endl;
else{
cout << "The least number: " << (result / N) << endl;
cout << "The multi result: " << result <<endl;
}
}
return 0;
}
运行结果: