找符合条件的数(编程之美)

来源:互联网 发布:科比职业生涯总数据 编辑:程序博客网 时间:2024/05/17 04:41

任意一正整数 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;}



运行结果:


    

 

 

 

0 0
原创粉丝点击