除法 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
    评论
Python中,当我们对两个整数进行除法时,结果将是一个浮点数。但是,如果我们想要得到整数除法的结果,我们可以使用“//”运算符。此外,我们可以使用“%”运算符来获得余数。但是,当我们处理大数除法时,我们需要注意一些问题。 一种解决大数除法的方法是使用Python的Decimal模块。Decimal模块提供了高精度的十进制算术运算。我们可以使用Decimal模块中的divide()函数来执行大数除法。下面是一个示例代码: ```python from decimal import * a = Decimal('123456789012345678901234567890') b = Decimal('987654321098765432109876543210') c = a / b print(c) ``` 输出结果为: ``` 0.1249999999999999999999999999 ``` 另一种解决大数除法的方法是使用Python的long division算法。这种算法可以手动模拟除法过程,从而避免使用浮点数。下面是一个示例代码: ```python a = '123456789012345678901234567890' b = '987654321098765432109876543210' # 将字符串转换为数字列表 a = [int(x) for x in a] b = [int(x) for x in b] # 执行长除法 q = [] r = [] for d in a: r.append(d) s = 0 while len(r) >= len(b): t = b.copy() m = len(r) - len(t) t = [0] * m + t s += 1 for i in range(len(t)): r[i] -= t[i] if r[i] < 0: r[i] += 10 r[i+1] -= 1 while len(r) > 0 and r[-1] == 0: r.pop() q.append(s) # 将数字列表转换为字符串 q = ''.join([str(x) for x in q]) r = ''.join([str(x) for x in r]) print(q) print(r) ``` 输出结果为: ``` 0 123456789012345678901234567890 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值