• HDU 1271 整数对


    Problem Description

    Gardon和小希玩了一个游戏,Gardon随便想了一个数A(首位不能为0),把它去掉一个数字以后得到另外一个数B,他把A和B的和N告诉了小希,让小希猜想他原来想的数字。不过为了公平起见,如果小希回答的数虽然不是A,但同样能达到那个条件(去掉其中的一个数字得到B,A和B之和是N),一样算小希胜利。而且小希如果能答出多个符合条件的数字,就可以得到额外的糖果。
    所以现在小希希望你编写一个程序,来帮助她找到尽可能多的解。
    例如,Gardon想的是A=31,B=3 告诉小希N=34,
    小希除了回答31以外还可以回答27(27+7=34)所以小希可以因此而得到一个额外的糖果。

    Input

    输入包含多组数据,每组数据一行,包含一个数N(1<=N<=10^9),文件以0结尾。

    Output

    对于每个输入的N,输出所有符合要求的解(按照大小顺序排列)如果没有这样的解,输出"No solution."

    Sample Input

    34 152 21 0

    Sample Output

    27 31 32 126 136 139 141 No solution.

    枚举拿去的那一位数的位置,将原来的数字拆成A+B+C的形式,B表示的是拿去的那一个数字,A和C分别表示被拿去的数的前面部分和后面部分

    那么原来的数字a可以表示成A*10^k+B*10^k-1+C

    拿去数字时候的那个数字就可以表示成A*10^k-1+C

    相加等于N即得出答案,枚举B和K,判断是否可行即可,注意细节处理

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <set>
    #include <vector>
    
    using namespace std;
    
    int p10[10] = {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
    
    int solve(int n) {
        int len = log10(n) + 1;
        set<int> note;
        //c不进位
        for(int b = 0;b <= 9;b++) {
            for(int k = 1;k <= len;k++) {
                int n1 = n / p10[k - 1];
                if((n1 - b) % 11 == 0 && n % p10[k - 1] % 2 == 0) {
                    int c = n % p10[k - 1] / 2,a = (n1 - b) / 11;
                    note.insert(a * p10[k] + b * p10[k - 1] + c);
                }
            }
        }
        //c进位
        for(int b = 0;b <= 9;b++) {
            for(int k = 2;k <= len;k++) {
                int n1 = n / p10[k - 1] - 1;
                if(n1 != 0 && (n1 - b) % 11 == 0 && n % p10[k - 1] % 2 == 0) {
                    int c = (n % p10[k - 1] + p10[k - 1]) / 2,a = (n1 - b) / 11;
                    int num = p10[k - 1] * (11 * a + b) + 2 * c;
                    note.insert(a * p10[k] + b * p10[k - 1] + c);
                }
            }
        }
        if(note.empty()) {
            printf("No solution.");
        } else {
            printf("%d",*note.begin()); note.erase(note.begin());
            while(!note.empty()) {
                printf(" %d",*note.begin());
                note.erase(note.begin());
            }
        }
        printf("
    ");
    }
    
    int main() {
        int n;
        while(scanf("%d",&n),n) {
            solve(n);
        }
        return 0;
    }
  • 相关阅读:
    适配者模式7(10)
    规范使用线程池与底层原理详解
    Java集合多线程安全
    CAS底层原理与ABA问题
    手写数字识别-小数据集
    深度学习-卷积
    Java并发编程volatile关键字
    朴素贝叶斯-垃圾邮件分类
    K均值算法
    mysql搭建主从复制(一主一从,双主双从)
  • 原文地址:https://www.cnblogs.com/rolight/p/3606319.html
Copyright © 2020-2023  润新知