POJ - 1426 Find The Multiple
Posted shiyu-coder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 1426 Find The Multiple相关的知识,希望对你有一定的参考价值。
题目:
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits.
Input
The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.
Output
For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.
Sample Input
2 6 19 0
Sample Output
10 100100100100100100 111111111111111111
这道题看似麻烦,实际上直接暴力搜索就行了。。。
利用状态压缩搜索2^20以内的所有二进制数(之所以次数是20,是因为再大一些就超过long long的范围而
溢出了,实际上这个范围已经很多余了,很小的数就能满足条件),然后每个都换成二进制表示,这个二进制
表示直接当作十进制数就是m,然后检测每一个m是否符合要求,找到符合要求的输出就行了。
代码:
1 #include<iostream> 2 using namespace std; 3 int line[100]={0}; //倍数不会大于100 4 const int LEN=20; 5 6 int main(){ 7 int n=0; 8 9 cin >>n; 10 while(n!=0){ 11 //状态压缩 12 for(long long i=1;i<(2<<LEN);i++){ 13 for(int j=0;j<LEN;j++){ 14 line[j]=(i>>j)&1; 15 } 16 int len=LEN-1; //m的长度 17 while(line[len]==0&&len>=0){ 18 len--; //找到m的长度 19 } 20 long long m=0; 21 for(int j=len;j>=0;j--){ 22 m=m*10+line[j]; //计算m 23 } 24 //检查m是不是n的倍数 25 if(m%n==0){ 26 cout <<m<<endl; 27 break; 28 } 29 } 30 cin >>n; 31 } 32 33 system("pause"); 34 return 0; 35 }
以上是关于POJ - 1426 Find The Multiple的主要内容,如果未能解决你的问题,请参考以下文章
广搜+打表 POJ 1426 Find The Multiple
POJ 1426 - Find The Multiple - [DP][BFS]