• PAT 1023 Have Fun with Numbers


    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 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<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define maxnum 100005
    
    int a[30] = {0};
    int count1[10] = {0}; //分别对倍乘前后的位计数
    int count2[10] = {0};
    
    int main(){
        string s;
        cin >> s;
        int len = s.size();
        for(int i=0;i < s.size();i++){
            a[i] = s[i]-'0';
        }
        for(int i=0;i < len;i++){
            count1[a[i]]++;
        }
        for(int i=0;i < len/2;i++){ //翻转
            swap(a[i],a[len-i-1]);
        }
    
        int jinwei = 0;   //倍乘
        for(int i=0;i <= len;i++){
            int num = a[i]*2 + jinwei;
            a[i] = num%10;
            jinwei = (num)/10;
        }
    
    //    for(auto num:a) cout << num << " ";
    
        int pos = 0;
        for(int i=30;i >= 0;i--){
            if(a[i]){pos = i;break;}
        }
        for(int i=0;i <= pos;i++){
            count2[a[i]]++;
        }
    
        int flag = 1;
        for(int i=0;i < 10;i++){
            if(count1[i] != count2[i])flag = 0;
        }
        if(flag) cout << "Yes" << endl;
        else cout << "No" << endl;
    
        for(int i=pos;i >= 0;i--){
            cout << a[i];
        }
    
    
        return 0;
    }

    _

     
  • 相关阅读:
    LeetCode -- Rectangle Area
    【转】VS常用快捷键
    C++中include<> 与 include" " 的区别
    浅析_tmain() 与 main() 函数的区别
    VS2013下配置OpenCV 3.0.0 &&& VS2013下配置Opencv2.4.9
    LeetCode -- Valid Parenthese
    杂想 · 警醒
    LeetCode -- Length of Last Word
    LeetCode -- Valid Sudoku
    LeetCode -- Binary Tree Level Order Traversal II
  • 原文地址:https://www.cnblogs.com/cunyusup/p/10696692.html
Copyright © 2020-2023  润新知