#include
using namespace std;
void new_fin(char x[], int& x1);//输入计算数
bool yz(char xx);//验证输入正确性。
void new_line();//输入非16进制数后用于丢弃行。
void char_int(char y[], int y1[], const int yw);//将字符转换成数字。
int n_add(int v1[], int v2[], int ans[], const int v1w, const int v2w, int& answ);//将两个int数组用16进制相加后结果填入ans数组里。
void int_char(int z[], char z1[], const int zw);//将数字转换成字符。
void n_point(char ans[], const int number);//打印计算结果。
int main()
{
char one[1000],two[1000];//两个等待被计算的16进制数。
int one1[1000],two1[1000];//两个被转换成int类型的计算数。
int three[1001];//相加得到的结果。
char three1[1001];//将相加的结果变成16进制数形式。
char reusing;//程序循环。
do
{
int onew=0;//第一个数的填充长度 。
int twow=0;//第二个数的填充长度。
int threew=0;//结果的填充长度。
cout << "现在请你输入第一个16进制被加数按回车结束: ";
new_fin(one,onew);
cout << "现在请你输入第二个16进制被加数按回车结束: ";
new_fin(two, twow);
//以上为输入两个16进制数。
char_int(one,one1,onew);
char_int(two,two1,twow);
//以上为将两个16进制数转换为int类型的数。
n_add(one1,two1,three,onew,twow,threew);//两个int类型的数相加。
int_char(three, three1, threew);//得到的结果在转换为字符类型。
n_point(three1, threew);//打印。
cout << "\n是否继续计算?(y/n): ";
cin >> reusing;
new_line();
}while((reusing=='y')||(reusing=='Y'));
return 0;
}
void new_fin(char x[], int& x1)//输入计算数
{
using namespace std;
char x_old, ians;
do
{
cin.get(x_old);
while(yz(x_old))
{
x[x1]=x_old;
x1++;
cin.get(x_old);
}
if(x_old == '\n')
{
ians='o';
}
else
{
cout << "输入了非法的16进制数,你得重新输入:";
x1=0;
new_line();
ians='y';
}
}while(ians=='y');
}
bool yz(char xx)//验证输入正确性。
{
bool fin;
switch(xx)
{
case '0':
fin=true;
break;
case '1':
fin=true;
break;
case '2':
fin=true;
break;
case '3':
fin=true;
break;
case '4':
fin=true;
break;
case '5':
fin=true;
break;
case '6':
fin=true;
break;
case '7':
fin=true;
break;
case '8':
fin=true;
break;
case '9':
fin=true;
break;
case 'a':
fin=true;
break;
case 'b':
fin
=true;
break;
case 'c':
fin=true;
break;
case 'd':
fin=true;
break;
case 'e':
fin=true;
break;
case 'f':
fin=true;
break;
default:
fin=false;
}
return fin;
}
void new_line()//输入非16进制数后用于丢弃行。
{
char a;
while(a!='\n')
{
cin.get(a);
}
}
void char_int(char y[], int y1[], const int yw)//将字符转换成数字。
{
for(int b=0; b
switch(y[b])
{
case '0':
y1[b]= 0;
break;
case '1':
y1[b]= 1;
break;
case '2':
y1[b]= 2;
break;
case '3':
y1[b]= 3;
break;
case '4':
y1[b]= 4;
break;
case '5':
y1[b]= 5;
break;
case '6':
y1[b]= 6;
break;
case '7':
y1[b]= 7;
break;
case '8':
y1[b]= 8;
break;
case '9':
y1[b]= 9;
break;
case 'a':
y1[b]= 10;
break;
case 'b':
y1[b]= 11;
break;
case 'c':
y1[b]= 12;
break;
case 'd':
y1[b]= 13;
break;
case 'e':
y1[b]= 14;
break;
case 'f':
y1[b]= 15;
break;
default:
cout << "结束标志!!";
}
}
}
int n_add(int v1[], int v2[], int ans[], const int v1w, const int v2w, int& answ)//将两个int数组用16进制相加后结果填入ans数组里。
{
int aa1=v1w, bb1=v2w, text=0;
if(v1w>v2w)
{
while((bb1-1)>=0)
{
ans[aa1-1]= v1[aa1-1]+v2[bb1-1];
bb1--;
aa1--;
}
for(int m=aa1-1; m>=0; m--)
{
ans[m]=v1[m];
}
answ=v1w;
}
if(v1w
while((aa1-1)>=0)
{
ans[bb1-1]= v1[aa1-1]+v2[bb1-1];
bb1--;
aa1--;
}
for(int q=bb1-1; q>=0; q--)
{
ans[q]=v2[q];
}
answ=v2w;
}
if(v1w==v2w)
{
for(int p=0; p
ans[p]=v1[p]+v2[p];
}
answ=v1w;
}
for(int x=answ-1; x>=0; x--)
{
if(ans[x]>=16)
{
if(x==0)
{
ans[x]=ans[x]-16;
text=1;
}
else
{
ans[x]=ans[x]-16;
ans[x-1]++;
}
}
}
if(text==1)
{
for(int z=answ; z>0; z--)
{
ans[z]= ans[z-1];
}
ans[0]=1;
answ++;
}
}
void int_char(int z[], char z1[], const int zw)//将数字转换成字符。
{
for(int c=0; c
switch(z[c])
{
case 0:
z1[c]= '0';
break;
case 1:
z1[c]= '1';
break;
case 2:
z1[c]= '2';
break;
case 3:
z1[c]= '3';
break;
case 4:
z1[c
]= '4';
break;
case 5:
z1[c]= '5';
break;
case 6:
z1[c]= '6';
break;
case 7:
z1[c]= '7';
break;
case 8:
z1[c]= '8';
break;
case 9:
z1[c]= '9';
break;
case 10:
z1[c]= 'a';
break;
case 11:
z1[c]= 'b';
break;
case 12:
z1[c]= 'c';
break;
case 13:
z1[c]= 'd';
break;
case 14:
z1[c]= 'e';
break;
case 15:
z1[c]= 'f';
break;
default:
cout << "可能输入错误了,检查是否属于10-15的数!!";
}
}
}
void n_point(char ans[], const int number)//打印计算结果。
{
cout << "\n两个16进制数相加的结果为: ";
for(int k=0; k
cout << ans[k];
}
}