题目描述
我军拦截敌军传递了2个数字串,后经侦查得知,这两个数字串中包含了一个很重要的密码,这个密码的破译方式为,用这两个数字串中的大数 – 小数,得到结果后将结果转换为16进制(转换时如需使用字母请使用大写字母),就是敌军想要传递的密码。
比如,敌军传递了下列两个数字串:
99999999999999999999999999999999999999973
99999999999999999999999999999999999999999
大数 – 小数的差值 = 26,转换为16进制的结果为1A,也就是1A就是敌军想要传递的密码。
请编程实现破译密码的过程。
输入格式
输入有2行,分别是2个不超过200位的整数,且已知2个整数的差是一个不超过18位的整数。
输出格式
输出按题意计算出的16进制数。
提示/说明
样例输入1:
99999999999999999999999999999999999999973
99999999999999999999999999999999999999999
样例输出1:
1A
样例输入2:
999999999
3847
样例输出2:
3B9ABAF8
下面是我写的题解
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a1[250],b1[250],c1[250];
int a[250],b[250],c[250],lena,lenb,d=1,x=0,y=0,z=0,v=0,n=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>a1>>b1;
if(strlen(a1)<strlen(b1)||(strlen(a1)==strlen(b1)&&strcmp(a1,b1)<0))
{
strcpy(c1,a1);
strcpy(a1,b1);
strcpy(b1,c1);
}
lena=strlen(a1);
lenb=strlen(b1);
for(int i=0;i<=lena-1;i++)
{
a[lena-i]=int(a1[i]-'0');
}
for(int i=0;i<=lenb-1;i++)
{
b[lenb-i]=int(b1[i]-'0');
}
while(d<=lena||d<=lenb)
{
if(a[d]<b[d])
{
a[d]+=10;
a[d+1]--;
}
c[d]=a[d]-b[d];
d++;
}
x=d;
while((c[x]==0)&&(x>1))
{
x--;
}
for(int i=x;i>=1;i--)
{
y+=c[i]*pow(10,i-1);
}
while(y!=0)
{
n++;
z=y%16;
y/=16;
c[n]=z;
v++;
}
for(int i=v;i>=1;i--)
{
if((c[i]>=0)&&(c[i]<=9)) cout<<c[i];
if(c[i]==10) cout<<"A";
if(c[i]==11) cout<<"B";
if(c[i]==12) cout<<"C";
if(c[i]==13) cout<<"D";
if(c[i]==14) cout<<"E";
if(c[i]==15) cout<<"F";
}
cout<<endl;
return 0;
}