POJ 1426 - Find The Multiple(简单深搜)

题目链接:POJ - 1426

                                        Find The Multiple  

                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
                                        Total Submission(s): 23972    Accepted Submission(s): 6521


 

Problem Description

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 containint 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 containint 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

 

题意解析:

数据给出一个数字 n,然后我们需要找出任意一个满足一下条件的数字,然后输出即可:

1. 这个数字全部由 01 组成;(是十进制哦!)

2. 一定要是 n 的倍数;

 

思路分析:

既然需要找一个全是由 01 组成的数字,那我们就使用递归的方法,让1分两个方向进行递归,一个是乘 10,一个是乘 10 加  1,这样就不会漏掉所有仅由 01 组成的数字啦!

不过有一个需要注意的点,long long int 只能存下 19 位,所以当我们找到那个需要找的数字,或者位数已经达到19位了,就应该返回了,不然超出范围是错误的!!

 

代码篇:

#include <iostream>
#include <cstring>
#include <cstdio>
#define ll long long
using namespace std;
int x, flag, a;
ll y;
void DFS(int x, ll y)       ///x为位数,y为当前值
{
    if(x > 19 || flag == 1) ///如果位数到了19位,或者找到了,就退出递归
        return ;
    if(y % a == 0)
    {
        flag = 1;
        cout << y << endl;
        return ;
    }
    DFS(x + 1, y * 10);     ///两个方向来递归
    DFS(x + 1, y * 10 + 1);
}
int main()
{
    while(cin >> a)
    {
        if(a == 0)
            break;
        flag = 0;
        DFS(1, 1);          ///从位数为1,底数为1开始递归
    }
    return 0;
}

 

OVER!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值