-
题目链接:D进制的A+B (20)
-
题目描述
输入两个非负10进制整数A和B(<= 2 30 − 1 2^{30}-1 230−1),输出A+B的D (1 < D <= 10)进制数。
-
输入描述:
输入在一行中依次给出3个整数A、B和D。
-
输出描述:
输出A+B的D进制数。
-
输入例子:
123 456 8
-
输出例子:
1103
-
满分代码(使用了大数运算)
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <cmath> using namespace std; int D[10] = {0}; //大数除法 void div(string a,int b,string &res,int &yu) { int v,r,t = 0; for(int i=0;i<a.length();i++) { v = t*10+(a[i]-'0'); r = v/b; t = v%b; res.push_back('0'+r); } while(res.length()>0 && res[0]=='0') res.erase(0,1); yu = t; } //大数加法 string add(string a,string b) { string res; int t = a.length()-b.length(); if(t>0) b.insert(0,t,'0'); else a.insert(0,-t,'0'); int ta,tb,tsum,tres,tc=0; for(int i=a.length()-1;i>=0;i--) { ta = a[i]-'0'; tb = b[i]-'0'; tsum = ta+tb+tc; tres = tsum%10; //本位和 tc = tsum/10; //进位 res.insert(0,1,tres+'0'); } if(tc!=0) res.insert(0,1,tc+'0'); //最高位进位 return res; } int main() { vector<int> out; string a,b,sum; int D; cin>>a>>b>>D; //求a+b的和 sum = add(a,b); //把和转为D进制 int yu; string t; while(sum.length()!=0) { div(sum,D,t,yu); out.insert(out.begin(),1,yu); sum = t; t.clear(); } //C++ 11 形式的遍历 for(auto i:out) cout<<i; return 0; }
-
说明:
-
这个题的数据范围,其实也不用大数加法和除法,直接用
int
也没问题啦 -
附一个别人写的递归解法,可以学习学习
#include<iostream> using namespace std; //递归函数:输出N进制形式的十进制数num //递归公式:输出N进制形式的十进制数num = 输出N进制形式的十进制数num/N + 输出N进制形式的十进制数num的最低位 void dt(int num,int N) { if(num/N) dt(num/N,N); cout<<num%N; } int main() { int A,B,D; cin>>A>>B>>D; dt(A+B,D); return 0; }
-
PAT乙级 —— 1012 D进制的A+B (20)
最新推荐文章于 2024-09-01 20:56:03 发布