CNUOJ 0703 20701除法


20701除法

难度级别: B; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述
输入正整数n,按从小到大的顺序输出所有满足表达式abcde/fghij=n的abcde和fghij,其中a~j恰好为数字0~9的一个排列。 如果没有符合题意的数,输出0。本题所说的五位数可以包括前导0的,如01234在这里也称为五位数。

输入

一个正整数n 

输出

若干行,每行包括两个符合要求的五位正整数(每行的两个数先大后小),两数之间用一个空格隔开。 

输入示例

62

输出示例

79546 01283
94736 01528

其他说明

数据范围 2≤n≤79;题目中的从小到大指的是输出数据每行的第一个数是从小到大的顺序。 

首先拿到这道题,最先的思路肯定是暴搜。也就是说,要把两个数都枚举出来再进行验证?当然不用,我们只要枚举出一个数来,就可以找到另一个数了。于是我们得到了一个初级代码:

#include<cstdio>
int n,x,y;
int main()
{
    scanf("%d",&n);
    int f,g,h,i,j;
    for(int a=0;a<=9;a++)
    {
        for(int b=0;b<=9;b++)
        {
            b+=(b==a);
            if(b>9) break;
            for(int c=0;c<=9;c++)
            {
                c+=(c==a);
                c+=(c==b);
                if(c>9) break;
                for(int d=0;d<=9;d++)
                {
                    d+=(d==a);
                    d+=(d==b);
                    d+=(d==c);
                    if(d>9) break;
                    for(int e=0;e<=9;e++)
                    {
                        e+=(e==a);
                        e+=(e==b);
                        e+=(e==c);
                        e+=(e==d);
                        if(e>9) break;
                        for(int u=1;u<=1;u++)
                        {
                        x=a*10000+b*1000+c*100+d*10+e;
                        y=x*n;
                        if(y>99999) break;
                        //printf("%d %d",x,y);
                        f=y/10000;
                        g=(y%10000)/1000;
                        h=(y%1000)/100;
                        i=(y%100)/10;
                        j=y%10;
                        if(f==g||f==h||f==i||f==j) break;
                        if(g==h||g==i||g==j) break;
                        if(h==i||h==j) break;
                        if(i==j) break;
                        if(f==a||f==b||f==c||f==d||f==e) break;
                        if(g==a||g==b||g==c||g==d||g==e) break;
                        if(h==a||h==b||h==c||h==d||h==e) break;
                        if(i==a||i==b||i==c||i==d||i==e) break;
                        if(j==a||j==b||j==c||j==d||j==e) break;
                        else printf("%d %d%d%d%d%d\n",y,a,b,c,d,e);
                        }
                    }
                }
            }
        }
    }
    //system("pause");
}

然而当你兴奋地提交上去之后,却会发现要么就是结果错误要么就是时间超限。这是程序效率太低的缘故,这时我们不妨换一个方式来枚举,只用一个循环,就可以把所有的数都枚举出来,时间复杂度还会大大减少。

#include<iostream>
long long n,x,y;
bool t[9];
int o=0;
int main()
{
    scanf("%lld",&n);
    long long f,g,h,i,j,a,b,c,d,e;
    for(x=1234;x<99999;x++)
    {
        for(int u=1;u<=1;u++)
        {
        f=x/10000;
        g=(x%10000)/1000;
        h=(x%1000)/100;
        i=(x%100)/10;
        j=x%10;
        if(f==g||f==h||f==i||f==j) break;
        if(g==h||g==i||g==j) break;
        if(h==i||h==j) break;
        if(i==j) break;
        y=x*n;
        if(y>=99999) break;
        a=y/10000;
        b=(y%10000)/1000;
        c=(y%1000)/100;
        d=(y%100)/10;
        e=y%10;
        if(a==b||a==c||a==d||a==e) break;
        if(b==c||b==d||b==e) break;
        if(c==d||c==e) break;
        if(d==e) break;
        for(int l=0;l<=9;l++) t[l]=0;
        t[a]=1;t[b]=1;t[c]=1;t[d]=1;t[e]=1;t[f]=1;t[g]=1;t[h]=1;t[i]=1;t[j]=1;
        for(int l=0;l<=9;l++) if(!t[l]) goto lab;
        o++;
        printf("%lld%lld%lld%lld%lld %lld%lld%lld%lld%lld\n",a,b,c,d,e,f,g,h,i,j);lab:    int p;
        }
    }
    if(!o) printf("0");
    //system("pause");
}
时间: 2025-01-06 14:37:17

CNUOJ 0703 20701除法的相关文章

COJ 0046 20701除法

20701除法 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述     输入正整数n,按从小到大的顺序输出所有满足表达式abcde/fghij=n的abcde和fghij,其中a~j恰好为数字0~9的一个排列. 如果没有符合题意的数,输出0.本题所说的五位数可以包括前导0的,如01234在这里也称为五位数. 输入 一个正整数n  输出 若干行,每行包括两个符合要求的五位正整数(每行的两个数先大后小),两数之间用一个空格隔开.

c++20701除法(刘汝佳1、2册第七章,暴搜解决)

20701除法 难度级别: B: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述     输入正整数n,按从小到大的顺序输出所有满足表达式abcde/fghij=n的abcde和fghij,其中a~j恰好为数字0~9的一个排列. 如果没有符合题意的数,输出0.本题所说的五位数可以包括前导0的,如01234在这里也称为五位数. 输入 一个正整数n  输出 若干行,每行包括两个符合要求的五位正整数(每行的两个数先大后小),两数之

shell中除法运算

A=`expr $num1 / $num2` 这个时候num3=0 ,是因为是因为expr不支持浮点除法 小数点标识的方法: A=`echo "scale=2; $num1/$num2" | bc` 使用bc工具,sclae控制小数点后保留几位 另一种方法 A=awk 'BEGIN{printf "%.2f\n",'$num1'/'$num2'}' 百分比表示 A=awk 'BEGIN{printf "%.2f%\n",('$num1'/'$nu

计算机中如何实现除数是2的幂次的除法【转载自CSDN】

前言: 本来是在看汇编里面的数据条件传送指令,做习题的时候看着这么一道有关于2的幂次方除法的题目.结果傻眼了,又尼玛不会了.........第二章看的时候就稀里糊涂的,看了几遍也没看太懂,这回又涉及到了 ,发现再回来看还是容易一点.所以写此博文,方便日后复习. 我今天遇到的问题如下: 问题: 除法,在我们平时的算数运算中,结果总是向0的方向舍入的,但是在计算机中,舍入的方式有所不同.在大多数的机器中,除法要比乘法还有加法这些运算都要慢很多倍,计算机中对于2的幂次这种数很是敏感,因为计算机当中用到

【练习赛2补题】poj 2325 Persistent Numbers 【高精度除法+贪心】

Description The multiplicative persistence of a number is defined by Neil Sloane (Neil J.A. Sloane in The Persistence of a Number published in Journal of Recreational Mathematics 6, 1973, pp. 97-98., 1973) as the number of steps to reach a one-digit

一个基础而奇怪的问题:算法执行加法、乘法、除法性能无区别?

一个基础而奇怪的问题:算法执行加法.乘法.除法性能无区别? 计算机原理分析觉得:加法.乘法和除法的计算性能依次减少,但减少到什么程度? 编写C程序用30次百万数据计算来測试时间差异性,代码例如以下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0; i

大数的减法除法

1.除法 1 //反着除 2 //c==0; 3 for(j=len;j>=1;j--) 4 { 5 s=a[j]+c*10; 6 a[j]=s/(i+1); 7 c=s%(i+1); 8 } 9 10 //排除前面的0 11 while(a[i][len]==0) 12 len--; 13 a[0]=len; 2.减法 跟除法的方式类似. 略.

1098: 零起点学算法05——除法算术题

1098: 零起点学算法05--除法算术题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 2346  Accepted: 1932[Submit][Status][Web Board] Description 乘法会了,除法也一样的.不要跟我说不会哦. Input 没有输入 Output 输出12除以2的值,计算让计算机去做哦 Sample Output 6 Source 零起点学算法 1 #i

1099:零起点学算法06——再来一题除法算术题

1099: 零起点学算法06--再来一题除法算术题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 4811  Accepted: 1917[Submit][Status][Web Board] Description 再来一题除法算术题 Input 没有输入 Output 输出8除以5,保留1位小数 Sample Output 1.6 Source 零起点学算法 1 # include <std