PAT乙:1022 D进制的A+B (20 分)



一、题目

输入两个非负 10 进制整数 A 和 B ( ≤ 2 30 ​ ​ − 1 ) (≤2^{30}​​ −1) (2301),输出 A+B 的 D (1<D≤10)进制数。

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例1:
123 456 8

输出样例1:
3.2.1

输入样例2:
14.1.28 10.16.27

输出样例2:
1103


二、思路和注意事项

分析:

  1. 进制转换过程就是不断的除进制取模,并存储到数组中
  2. 部分正确的可能原因: 没有对sum=0进行特判
  3. 也可以用string或者vector等容器 来存储,最后reverse,即把所有的元素逆序。



三、AC代码

(1) 数组存储


#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm> 
using namespace std;
int main()
{
    
    
	int M, N, p;
	int sum = 0, i = 0;
	int ans[100] = {
    
     0 };
	cin >> M >> N >> p;
	sum = M + N;
	if(sum==0)
    {
    
    
        printf("0\n");
        return 0;
    }
	while (sum != 0)
	{
    
    
		ans[i] = sum % p;
		sum /= p;
		i++;
	}
	
	for (int k = i-1; k >= 0; k--)
	{
    
    
		cout << ans[k];
	}
}

(2)Vector容器

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm> 
using namespace std;
int convert(int k, int p);
int main()
{
    
    
	vector<int>ans;
	vector<int>::iterator it;

	int M, N, p, sum = 0;
	cin >> M >> N >> p;
	sum = M + N;
	
	if (sum == 0) 								//特判
	{
    
    
		cout << "0" << endl;
	}
	else
	{
    
    
			while (sum != 0)
		{
    
    
			ans.push_back(sum % p);
			sum /= p;
		}
		
			reverse(ans.begin(), ans.end());  //最后逆序输出
		
		for (it = ans.begin(); it != ans.end();++it)
		{
    
    
			cout << *it;
		}
	}
}

(3)stirng去存储进制数

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm> 
using namespace std;
int convert(int k, int p);
int main()
{
    
    
	int M, N, p, sum = 0;
	cin >> M >> N >> p;
	sum = M + N;
	if (sum == 0)
	{
    
    
		cout << "0" << endl;
		return 0;
	}
	else
	{
    
    
		string str ="";
		while (sum != 0)
		{
    
    
			to_string(sum % p);
			str=str+ to_string(sum % p);;
			sum /= p;
		}
		reverse(str.begin(), str.end());
		cout << str << endl;
	}
}

以上三种均可。

猜你喜欢

转载自blog.csdn.net/SKMIT/article/details/113953086