POJ 1426 Find The Multiple

注:本人英语很渣,题目大意大多来自百度~=0=

 
这个题有点坑,答案不唯一
 
题目大意:给你一个数n, 你需要输出的是一个由1和0组成的数,此数能被n整除
 
解题思路:用s = 1做数的起点, s*10则相当于在后面加上0, s*10+1代表在后面加1, 用long long 来保存s足够了, 每次判断一下s % n  符合条件则输出
当然用dfs不能无限寻找下去  比如你第一次10000...0 假如n是奇数不可能有结果  所以每次递归记录一下层数;
long long 的范围是-9223 37203 68547 75808~9223 37203 68547 75807  所以查到19层如果还找不到结果的话, 就结束递归
 
下面是代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <cmath>
#include <cctype>
#define N 20010
#define each(i,n) (int i=1;i<=(n);++i)
using namespace std;
int a;
int dfs(long long s, int c)//c用来记录层数
{
    if(c == 19) return 0;
    if(s % a == 0) {
        printf("%lld\n", s);
        return 1;
    }
    else {
        int b = dfs(s * 10, c + 1);
        if(!b)
        dfs(s * 10 + 1, c + 1);
    }
}
int main()
{
 while(scanf("%d", &a), a) {
        dfs(1, 0);
 }
}

  

转载于:https://www.cnblogs.com/wangyuhao/p/4685104.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值