1074 宇宙无敌加法器

1074 宇宙无敌加法器

在这里插入图片描述

思路:
用string分别接收进制表和两个加数,然后存到三个列表里去。注意,进制表那个列表,假如string里的数字是0,则存进去的数字应该是10
当加数的位数不到N位时,前面补0至N位。
然后就是从最小位开始加和,和=加数+加数+flag进位标志:

  • 假如和小于进制,则该位就是和,flag=0
  • 假如和大于等于进制,则该位就是和减去进制,flag=1

输出的时候,注意:

  • 假如flag是1,那么正常输出整个数字即可,因为不会出现数字前面有0的情况
  • 假如flag是0,那么要先把前面的0都给去掉,再输出数字。
  • 假如把0去完之后发现数字没了(两数之和就是0),那么就输出0

PS:

  1. 最后答案前面的0注意要去掉
  2. 要考虑两数之和是0的情况(测试点5)
  3. 把char转换为int的方法:c-‘0’
#include<stdio.h>
#include<iostream>
#include<algorithm>

using namespace std;
int vel[25], vea[25], veb[25];
int main(void) {
	string s; cin >> s;
	string a, b; cin >> a >> b;
	while (a.size() < s.size()) { a = '0' + a; }
	while (b.size() < s.size()) { b = '0' + b; }
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == '0') { vel[i] = 10; }
		else { vel[i] = s[i] - '0'; }
		vea[i] = a[i] - '0';
		veb[i] = b[i] - '0';
	}
	reverse(vel, vel + s.size());
	reverse(vea, vea + s.size());
	reverse(veb, veb + s.size());

	int ans[25];
	int flag = 0;  // 进位标志
	for (int i = 0; i < s.size(); i++) {
		int he = vea[i] + veb[i] + flag;
		if (he < vel[i]) { ans[i] = he; flag = 0; }
		if (he >= vel[i]) { ans[i] = he - vel[i]; flag = 1; }
	}
	if (flag == 1) {
		ans[s.size()] = 1;
		for (int i = s.size(); i >= 0; i--) { cout << ans[i]; }
	}
	else {
		int n = s.size() - 1;
		while (ans[n] == 0 && n >= 0) { n--; }
		if (n < 0) { cout << 0; }
		else {
			for (int i = n; i >= 0; i--) { cout << ans[i]; }
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值