• UVA.725 Division (暴力)


    UVA.725 Division (暴力)

    题意分析

    找出abcdefghij分别是0-9(不得有重复),使得式子abcde/fghij = n。
    如果分别枚举每个数字,就会有10^10,肯定爆炸,由于分数值已知,其实发现可以通过枚举分母,来计算出分子,然后再看看这些数字是否符合题意即可。
    在枚举分母的时候,也可以根据条件过滤掉很多数字,我这里没有优化,直接暴力扫描1234-99999。

    #include <iostream>
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <sstream>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <cmath>
    #define nmax 200
    #define MEM(x) memset(x,0,sizeof(x))
    using namespace std;
    int digit[10];
    int n;
    int getdigit(int num)
    {
        int cnt = 0;
        while(num){
            cnt++;
            num/=10;
        }
        return cnt;
    }
    bool caldigit(int num)
    {
        if(getdigit(num)<=4) digit[0]++;
        else if(getdigit(num) >=6) return false;
        while(num){
            int t = num%10;
            digit[t] ++;
            num/=10;
        }
        for(int i = 0; i<=9; ++i){
            if(digit[i] == 0) return false;
            else if(digit[i] == 2) return false;
        }
        return true;
    }
    bool caldigiti(int num)
    {
        memset(digit,0,sizeof(digit));
        if(getdigit(num)<=4) digit[0]++;
        else if(getdigit(num) >=6) return false;
        while(num){
            int t = num%10;
            digit[t] ++;
            num/=10;
        }
        int cnt = 0;
        for(int i = 0; i<=9;++i){
            if(digit[i] == 2) return false;
            else if(digit[i] == 1) cnt++;
        }
        if(cnt == 5) return true;
        else return false;
    }
    void output(int a, int b)
    {
        int len1 = getdigit(a),len2 = getdigit(b);
        for(int i = 5-len1; i>0 ; --i) printf("0");
        printf("%d / ",a);
        for(int i = 5-len2;i>0 ;--i) printf("0");
        printf("%d = %d
    ",b,n);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        bool isfirst = true;
        while(scanf("%d",&n) && n){
            if(!isfirst) printf("
    ");
            int sta = 1234;bool isok = false;
            for(int i = sta;i<=99999;++i){
                if(caldigiti(i)){
                    int ans = n*i;
                    if(caldigit(ans)){
                        output(ans,i);
                        isok = true;
                    }
                }
            }
            if(!isok) printf("There are no solutions for %d.
    ",n);
            if(isfirst) isfirst = false;
    
        }
        return 0;
    }
  • 相关阅读:
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    交互式多媒体图书平台的设计与实现
    Ubuntu下VSCode调试环境搭建指南-C语言篇
    码农的自我修养之必备技能 学习笔记
    工程化编程实战callback接口学习笔记
    CentOS7.4网络配置
    R-CNN
    CUDA整理
    CUDA by Example 第四章 julia集
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367110.html
Copyright © 2020-2023  润新知