【PAT_1023】Have Fun with Numbers

题目描述:

数字123456789是一个9位数字,由1到9的数字组成,没有重复。 双倍它我们将获得246913578,这恰好是另一个9位数字,由1到9的数字组成,只是在不同的排列中。现在您要检查有更多此属性数字。,给定数字加倍k个后判断结果数字是否是只包含原始数字中数字的排列。

输入

一个位数不超过20位的正整数nums

输出

第一行:数字加倍后如果是只包含原始数字中的数字的排列则输出Yes否则输出No

第二行:输出nums*2的结果

思路

用一个string存储这个整数nums,并用map映射其中每个数字的个数。然后将每个数位*2+进位得到结果数,同时将map中的该数的value减一。只有到最后map的为空时,这两个数字是相等的一个排列

#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main() {
		string s;
		cin >> s;
		map<char, int>start;
		bool flag = true;
		int carry = 0,temp;
		for (int i = 0; i < s.size(); i++) {
			if (start.find(s[i]) == start.end()) {
				start.insert(pair<char, int>(s[i], 1));
			}
			else {
				start[s[i]]++;
			}
		}
		char c;
		vector<char>datas;
		for (int i = s.size() - 1; i >= 0;i--) {
			temp = (s[i] - '0') * 2 + carry;
			carry = temp / 10;
			c = temp % 10+'0';
			if(flag){
  			if (start.find(c) == start.end()) {
  			  flag=false;
  			}else {
  				start[c]--;
  				if(start[c]==0)start.erase(c);
  			}
			}
			datas.push_back(c);
		}
		if(carry!=0){
		  flag = false;
      datas.push_back(carry+'0');
    }
		if (!flag)cout << "No"<<endl;
		else { cout << "Yes"<<endl; }
		for (int i = datas.size() - 1; i >= 0; i--) {
			cout << datas[i];
		}
		return 0;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值