除法 Division Uva725

问题描述:
 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij= n的表达式,其中a~j恰好为数字0 ~ 9的一个排列(可以有前导0),2<=n<=79.
样例输入
62
样例输出
79546 / 01283 = 62
94736 / 01528 = 62

题记
暴力法也有简单和麻烦之分,单纯的全部枚举有10!种,计算量非常可怕。因为n>=2,所以abcde>fghij,a!=0,abcde<=98765,因此可以大致估计fghij的大致范围在01234~98765/n之间,这样一来枚举量大大减少了.
声明:本文的思路和代码均来自他人博客,俺只是为了便于以后查看复习写一写题记和代码的注释方便理解,原文地址如下:
原文地址https://blog.csdn.net/tigerisland45/article/details/52115616
代码如下

#include <iostream>
#include <stdio.h>
#include <memory.h>

const int digitnum=10;
using namespace std;


//判断abcdefghij是否为0~9的全排列
int check(int abcde,int fghij){
    int used[digitnum],d;  //used数组存储0~9各数字是否被用过,d用来暂时存放个位数
    memset(used,0,sizeof (used));

    if(fghij<10000)
        used[0]=1;  //fghij<10000则f=0,0被用过
    while(abcde){
        d=abcde%10;
        if(used[d])
            return 0;
        used[d]=1;
        abcde/=10;
    }

    while(fghij){
        d=fghij%10;
        if(used[d])
            return 0;
        used[d]=1;
        fghij/=10;
    }
    return 1;
}

int main()
{
    
    int n,abcde,count,end,i;

    while(scanf("%d",&n)==1 &&n){
        
        count=0;//数一下对于给定的n有几个满足的式子
        end=98765/n;

        for(i=1234;i<=end;i++){
            abcde=i*n;
            if(abcde>=12345&&check(abcde,i)){
                printf("%05d / %05d=%d\n",abcde,i,n);
                count++;
            }
        }
        if(count==0)
            printf("There are no solutions for %d.\n",n);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值