• 1023. Have Fun with Numbers (20)


    Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!

    Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.

    Input Specification:

    Each input file contains one test case. Each case contains one positive integer with no more than 20 digits.

    Output Specification:

    For each test case, first print in a line "Yes" if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or "No" if not. Then in the next line, print the doubled number.

    Sample Input:

    1234567899
    

    Sample Output:

    Yes
    2469135798
    #include<cstdio>
    #include<cstring>
    struct bign{
        int d[21];
        int len;
        bign(){
            memset(d,0,sizeof(d));
            len = 0;
        }
    };
    
    bign change(char str[]){
        bign a;
        a.len = strlen(str);
        for(int i = 0; i < a.len; i++){
            a.d[i] = str[a.len- i - 1] - '0';
        }
        return a;
    } 
    
    bign multi(bign a, int b){
        bign c;
        int carry = 0;
        for(int i = 0; i < a.len; i++){
            int temp = a.d[i] * b + carry;
            c.d[c.len++] = temp%10;
            carry = temp/10;        
        } 
        while(carry != 0){
            c.d[c.len++] = carry%10;
            carry /= 10;
        }
        return c;
    }
    
    bool judge(bign a,bign b){
        if(a.len != b.len) return false;
        int count[10] = {0};
        for(int i = 0; i < a.len; i++){
            count[a.d[i]]++;
            count[b.d[i]]--;
        }
        for(int i = 0; i < 10; i++){
            if(count[i] != 0) return false;
        }
        return true;
    }
    
    void print(bign a){
        for(int i = a.len-1; i >= 0; i--){
            printf("%d",a.d[i]);
        }
    }
    
    int main(){
        char str[21];
        gets(str);
        bign a = change(str);
        bign mul = multi(a,2);
        if(judge(a,mul) == true) printf("Yes
    ");
        else printf("No
    ");
        print(mul);
        return 0;
    }
  • 相关阅读:
    147-21. 合并两个有序链表
    146-14. 最长公共前缀
    145-如何查看python帮助文档
    144-38. 外观数列
    143-121. 买卖股票的最佳时机
    142-206. 反转链表
    141-98. 验证二叉搜索树
    Nginx中文域名配置
    Keepalived+Nginx架构整理版
    Tomcat启动脚本
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/8903581.html
Copyright © 2020-2023  润新知