题目描述
平时喜欢探索研究各种数形规律的邹一飞同学,这天激动的发现有这样一个数字,邹一飞说:“123456789999999999999是一个神奇的数字,只是由1,2,3,4,5,6,7,8,9这几个数字组成。将原先给的123456789999999999999这个数字加倍,我们将得到一个新数字246913579999999999998,这恰好有1,2,3,4,5,6,7,8,9组成,只是与数字123456789999999999999中,数位的排列方式不同。”
现在,邹一飞学长写给你一个k位的正整数,学长想请你通过编程帮助他判断将这个k位数字加倍以后得到的新数是否可以由原数字的里各数位的数字,重新排列后得出?
输入格式
共一行,包含一个整数
输出格式
输出这样的两行:
如果邹一飞学长给出的原数字的各数位在重新排列可以得到加倍后的数字,则在第一行输出 Yes,否则输出 No。
第二行,输出邹一飞学长给出的数字加倍后得到的数字。
输入样例#1
1234567899
输出样例#1
Yes
2469135798
注意
邹一飞学长有可能会给出超过20位的数字哦~
分析
- 接受的数据超过20位,基本的数据类型肯定不行,说一使用数组
- 接受字符串,让后转为int类型数组
- 然后数组从后往前加倍放入新的数组里,这里要注意进位的问题
- 最后加倍后的数组按照题目要求和原来的数组进行判断
代码
#include <iostream>
using namespace std;
#include<string>
int main()
{
string str;
cin>>str;
bool flag=false;
int len = str.length();
int* a = new int[len];
int* b = new int[len];
for (int i = 0; i < len; ++i) {
a[i] = (int)str[i]-48;
}
int carr=0;
for (int i = len-1; i >= 0; i--) {
b[i] = a[i]*2%10+carr;
carr = a[i]*2/10;
}
for (int i = 0; i < len; ++i) {
for (int j = 0; j < len; ++j) {
if(b[i] == a[j]){
flag = true;
break;
} else{
flag = false;
}
}
}
if(flag){
cout<<"Yes"<<endl;
for (int i = 0; i < len; ++i) {
cout<<b[i];
}
}else{
cout<<"No"<<endl;
for (int i = 0; i < len; ++i) {
cout<<b[i];
}
}
return 0;
}
注意: 这里在加倍的过程中应该考虑数据最高位也就是数组下标为0的位置,这里加倍后也有可能会出现进位的问题。