做题过程有点变态的一题
首先
这一题是可以用自带的十六进制转化计算几句话就写出来的
不过鉴于以为是大数
所以起初选择了以字符串模拟
(经过测试用时大概比直接写短五分之一)
于是……先放代码
#include<stdio.h>
#include<string.h>
char s[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char s1[20],s2[20];
int l1,l2;
int find(char c) {
int i=0;
while(s[i]!=c)
i++;
return i;
}
int vs() {
if(l1==l2)
return strcmp(s1,s2);
else {
if(l1>l2)
return 1;
else
return -1;
}
}
int main() {
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int a[20],b[20],sum[20];
while(scanf("%s %s",s1,s2)!=EOF) {
char c1='+',c2='+';
l1=strlen(s1),l2=strlen(s2);
if(s1[0]=='+') {
for(int i=0; i<l1-1; i++) {
s1[i]=s1[i+1];
}
l1--;
}
if(s1[0]=='-') {
c1='-';
for(int i=0; i<l1-1; i++) {
s1[i]=s1[i+1];
}
l1--;
}
if(s2[0]=='+') {
for(int i=0; i<l2-1; i++) {
s2[i]=s2[i+1];
}
l2--;
}
if(s2[0]=='-') {
c2='-';
for(int i=0; i<l2-1; i++) {
s2[i]=s2[i+1];
}
l2--;
}
int t0=0;
for(int i=0; i<l1; i++) {
if(s1[i]=='0')
t0++;
else
break;
}
if(t0)
for(int i=0; i<l1-t0; i++) {
s1[i]=s1[i+t0];
}
l1-=t0;
t0=0;
for(int i=0; i<l2; i++) {
if(s2[i]=='0')
t0++;
else
break;
}
if(t0)
for(int i=0; i<l2-t0; i++) {
s2[i]=s2[i+t0];
}
l2-=t0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
for(int i=0; i<l1; i++)
a[i]=find(s1[l1-i-1]);
for(int i=0; i<l2; i++)
b[i]=find(s2[l2-i-1]);
if(c1==c2) {
int lmax;
if(l1>l2)
lmax=l1;
else
lmax=l2;
for(int i=0; i<lmax; i++) {
if(sum[i]+a[i]+b[i]<16)
sum[i]+=a[i]+b[i];
else {
sum[i+1]=1;
sum[i]+=a[i]+b[i]-16;
}
}
if(sum[lmax]==1)
lmax++;
if(lmax==0)
printf("0
");
else {
if(c1=='-')
printf("%c",c1);
bool flag=false;
for(int i=lmax-1; i>=0; i--) {
if(s[sum[i]]!='0') {
printf("%c",s[sum[i]]);
flag=true;
} else {
if(flag)
printf("%c",s[sum[i]]);
}
}
printf("
");
}
} else {
int tvs=vs();
if(tvs==0)
printf("0
");
else {
int lmax;
if(tvs>0) {
if(l1>l2)
lmax=l1;
else
lmax=l2;
for(int i=0; i<lmax; i++) {
if(a[i]-b[i]<0) {
a[i+1]--;
sum[i]=a[i]+16-b[i];
} else
sum[i]=a[i]-b[i];
}
} else {
if(l1>l2)
lmax=l1;
else
lmax=l2;
for(int i=0; i<lmax; i++) {
if(b[i]-a[i]<0) {
b[i+1]--;
sum[i]=b[i]+16-a[i];
} else
sum[i]=b[i]-a[i];
}
}
while(sum[lmax-1]==0&&lmax>0)
lmax--;
if(lmax==0)
printf("0
");
else {
if(tvs>0&&c1=='-')
printf("%c",c1);
else if(tvs<0&&c2=='-')
printf("%c",c2);
bool flag=false;
for(int i=lmax-1; i>=0; i--) {
if(s[sum[i]]!='0') {
printf("%c",s[sum[i]]);
flag=true;
} else {
if(flag)
printf("%c",s[sum[i]]);
}
}
printf("
");
}
}
}
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
}
return 0;
}
大概思路明确之后
其实写起来一点一点还好
不过也是出现了大量的WA
各种细节问题
这个代码的亮点我觉得是以数组保存十六进制数字
然后需要转化时直接依据这个数组就好了
另外我觉得最大的收获是学会了自己进行数据测试
放上一份自己写的生成输入数据代码
#include<stdio.h>
#include <windows.h>
#include <time.h>
char s[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int main() {
//freopen("input.txt","r",stdin);
freopen("input.txt","w",stdout);
srand((unsigned)time(NULL));
for(int T=0; T<100000; T++) {
if(rand()%2)
if(rand()%2)
printf("+");
else
printf("-");
int l;
l=rand()%16+1;
for(int i=0; i<l; i++)
printf("%c",s[rand()%16]);
printf(" ");
if(rand()%2)
if(rand()%2)
printf("+");
else
printf("-");
l=rand()%16+1;
for(int i=0; i<l; i++)
printf("%c",s[rand()%16]);
printf("
");
}
return 0;
}
运行之后输入数据会保存成
input.txt
然后在自己的代码里加入
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
然后便可以从input.txt读取数据
输出到output.txt
配合标程输出的数据及文本对比软件(我用的TextDiff)
便可以快速的找出错误了
PS:上传时记得删除测试的那两句
否则会WA
(在下刚开始就是忘了删了)
总之不考虑其它的话
这一题还是收获颇丰的