【题意】
给出一个至多长20位的正整数,判断乘以2之后得到的数字是不是原数字各个位顺序重组
【思路】
用一个字符串读入输入的数字,去掉前面多余的0(经测试其实没有卡这个点),然后模拟乘法即可,将低位到高位的计算结果压进一个辅助栈方便输出。如果乘了2多了1位还要记得把最后一次的进位输出。
【注意点】
1. 题目中说数字可能达到20位,用unsigned long long也表示不下,所以需要用string读取,然后模拟乘法过程;
2. 最高位可能产生进位,输出的时候别漏了
#include <iostream>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
int main(int argc, char const *argv[])
{
string str;
stack<int> num;
int cnt[2][10];
memset(cnt,0,sizeof(cnt));
cin >> str;
//删掉前面多余的0,发现其实没有设这个陷阱= =
for(string::iterator it=str.begin(); it!=str.end();){
if(*it!='0'){
break;
}
else{
str.erase(it);
}
}
for(int i=0; i<str.length(); i++){
cnt[0][str[i]-'0']++;
}
int up=0;
int tmp;
for(int i=str.length()-1; i>=0; i--){
tmp = (str[i]-'0')*2+up;
cnt[1][tmp%10]++;
num.push(tmp%10);
up = tmp/10;
}
if(up){
cout << "No" << endl;
cout << up;
}
else{
int i;
for(i=0; i<10; i++){
if(cnt[0][i]!=cnt[1][i]){
break;
}
}
if(i==10){
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}
}
while(!num.empty()){
cout << num.top();
num.pop();
}
system("pause");
return 0;
}