【PAT_1023】Have Fun with Numbers

本文介绍了一种算法,用于检查一个数字翻倍后是否仅包含原始数字中的数字的排列。通过使用字符串存储整数并利用map记录各数字出现次数,确保了翻倍后的数字在重新排列后仍与原数字匹配。

题目描述:

数字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;
}

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值