PAT 1023 Have Fun with Numbers

原文鏈接:我的個人博客

原題鏈接

1023 Have Fun with Numbers

考點

  大整數運算

思路

  要求給定一個k位的數字,判斷它的兩倍是否是原來k的數的另一種排列。首先題目中說k可能有20位,因此即使用長整型也是沒有辦法表示的,何況還要乘以2.因此這裏涉及到大整數的加法。判斷2倍之後的數是否爲原來k個數的排列,也就是再問:原來的數和二倍之後的數是否由相同的數字組成,只是排列的方式可能不同。我這裏直接將兩個數的每一位數push_back進兩個vector容器中,然後判斷排序後的容器是否相同。

代碼

#include <bits/stdc++.h>
using namespace std;
string Double(string a){
    //計算a*a
    a = a.substr(a.find_first_not_of("0"));
    string c(a.length()+1,'0');
    reverse(a.begin(),a.end());
    int t=0,i;//t
    for(i=0;a[i];i++){
        t += (a[i]-'0')+(a[i]-'0');
        c[i] = t%10+'0';
        t /= 10;//進位
    }
    c[i] = t+'0';
    reverse(c.begin(),c.end()); 
    return c.substr(c.find_first_not_of("0")); 
}
int main(){
    string a;
    cin>>a;
    string b = Double(a);
    vector<int>v1,v2;
    for(int i=0;a[i];i++){
        v1.push_back(a[i]-'0');
    }
    for(int i=0;b[i];i++){
        v2.push_back(b[i]-'0');
    }
    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    if(v1==v2){
        cout<<"Yes"<<endl;
        cout<<b;
    }else{
        cout<<"No"<<endl;
        cout<<b<<endl;
    }
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章