题目描述
定义一个四进制的类,重定义“+”号实现四进制数的累加。
输入
第一行输入所需要的四进制数的个数
第二行开始,依次输入四进制数
输出
所有输入四进制数累加的和
输入样例1
3
13
2
21
输出样例1
102
思路分析
题目不长,但是题目很难,我觉得。
对于四进制转换,我看到的和我自己想到的,大概有三种方法,最普通最容易想到的就是像做大整数相加那样把它们整成字符串,然后一位一位相加,不过基数不是十而是四,但是,我觉得比较麻烦,因为得考虑到循环进位之类的问题。
比较难想到的就是我看到有大佬直接先当成十进制直接相加,然后逐位取出来和4比较大小,但我觉得这样仅仅是针对四进制有效而已,因为直接相加不会产生进位,最大也就是3+3,不会超过十,但是六进制及以上这种方法就不行了。
于是我用这种方法,直接进制转换,先变十进制数,大家相加完了再从十进制数变四进制数。
四进制变十进制很方便,直接从首位开始循环,每次乘4就可以了。
但是十进制变四进制就比较烧脑。
因为涉及字符串的插入问题,用char肯定麻烦,因为不知道有多少位,所以必须用string,先创建一个空的string类,然后每次在开头插入,因为进制转换规则是这样的,像C语言、计算机导论、计算机系统、数字电路之类的课程都有教进制转换。
AC代码
#include"iostream"
#include"string"
#include"cmath"
using namespace std;
class four
{
string number;
int decimal=0,i;
public:
four(string number):number(number){turndecimal();}
void turndecimal()
{
for(i=0;number[i];i++)
decimal=decimal*4+number[i]-'0';
}
void turnfour(int deci)
{
do
{
char code=deci%4+'0';
number.insert(number.begin(),code);
deci/=4;
}while(deci);
}
four operator + (four & a)
{
four c("");
c.turnfour(a.decimal+decimal);
c.turndecimal();
return c;
}
void show()
{
cout<<number;
}
};
int main()
{
int t;
string num="";
four sum(num);
cin>>t;
while(t--)
{
cin>>num;
four number(num);
sum=sum+number;
}
sum.show();
}