一眼看见这道的时候,首先就想到了模拟,然后就一直写一直写,虽然是一种笨的方法,不过,要一行一行敲的话,还可以练练代码速度,哼哼!
边写的时候脑海里边要想着有些什么情况比如说一个小数一个整数,小数是0的情况等等,然后,这就是一道纯的模拟题了!
我的代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#define Maxn 310
int an[Maxn],ann[Maxn],xn[Maxn],xnn[Maxn];//分别表示两整数左右两部分
//an表示A的整数部分,xn表示B的整数部分,另外两个是小数部分!
char st[Maxn],sv[Maxn];//两整数用字符型读入
void debug(){//调试所用
for(int i=0;i<Maxn;i++)
printf("%d",an[i]);
puts("");
}
int main(){
int i,j,k,t;
bool flaga,flagb;
while(~scanf("%s %s",st,sv)){
flaga=flagb=false;//标记是否为整数
memset(an,0,sizeof(an));//这些行memset()是用来清0的
memset(ann,0,sizeof(ann));
memset(xn,0,sizeof(xn));
memset(xnn,0,sizeof(xnn));
for(k=1;st[k]!=0;k++)
if(st[k]=='.'){//发现小数点,左右存进数组
for(i=k-1,t=0;i>=0;i--) an[t++]=st[i]-'0';
for(t=0,i=k+1;st[i]!=0;i++) ann[t++]=st[i]-'0';
flaga=true;
break;
}
if(!flaga){//如果A是整数
for(t=0,i=strlen(st)-1;i>=0;i--)
an[t++]=st[i]-'0';
}
for(k=1;sv[k]!=0;k++)
if(sv[k]=='.'){
for(i=k-1,t=0;i>=0;i--) xn[t++]=sv[i]-'0';
for(t=0,i=k+1;sv[i]!=0;i++) xnn[t++]=sv[i]-'0';
flagb=true;
break;
}
if(!flagb){//如果B为整数
for(t=0,i=strlen(sv)-1;i>=0;i--)
xn[t++]=sv[i]-'0';
}
if(!flaga&&!flagb){//如果都是整数做此if
for(i=0;i<Maxn;i++){
an[i]+=xn[i];
if(an[i]>9){
an[i+1]+=an[i]/10;
an[i]%=10;
}
}
bool flag=false;
for(i=Maxn;i>=0;i--){
if(flag) printf("%d",an[i]);
else if(an[i]){
flag=true;
printf("%d",an[i]);
}
}
puts("");
continue;
}
if(!flaga&&flagb){//A是整数,B不是
for(i=0;i<Maxn;i++){
an[i]+=xn[i];
if(an[i]>9){
an[i+1]+=an[i]/10;
an[i]%=10;
}
}
bool flag=false;
for(i=Maxn-1;i>=0;i--){//小心是maxn-1,我Maxn的时候错了!
if(flag) printf("%d",an[i]);
else if(an[i]){
flag=true;
printf("%d",an[i]);
}
}
int sp=-1;
for(i=Maxn-1;i>=0;i--){
if(xnn[i]){
sp=i;
break;
}
}
if(sp==-1){//如果小数部分全部是0以下同此
puts("");
continue;
}
else{
printf(".");
for(i=0;i<=sp;i++)
printf("%d",xnn[i]);
}
puts("");
continue;
}
if(flaga&&!flagb){//A不是整数,B是:
for(i=0;i<Maxn;i++){
an[i]+=xn[i];
if(an[i]>9){
an[i+1]+=an[i]/10;
an[i]%=10;
}
}
bool flag=false;
for(i=Maxn-1;i>=0;i--){
if(flag) printf("%d",an[i]);
else if(an[i]){
flag=true;
printf("%d",an[i]);
}
}
int sp=-1;
for(i=Maxn-1;i>=0;i--)
if(ann[i]){
sp=i;
break;
}
if(sp!=-1){
printf(".");
for(i=0;i<=sp;i++){
printf("%d",ann[i]);
}
}
puts("");
continue;
}//下面是 A和B都是浮点数!
for(i=Maxn-1;i>0;i--){//先加小数部分
ann[i]+=xnn[i];
if(ann[i]>9){
ann[i-1]+=ann[i]/10;
ann[i]%=10;
}
}
ann[0]+=xnn[0];//ann[0] 要特判可能要进位
if(ann[0]>9){
an[0]+=ann[0]/10;
ann[0]%=10;
}
for(i=0;i<Maxn;i++){//整数部分相加(一定要在小数部分先加之后)
an[i]+=xn[i];
if(an[i]>9){
an[i+1]+=an[i]/10;
an[i]%=10;
}
}
bool flag=false;//下面是输出
for(i=Maxn-1;i>=0;i--){
if(flag) printf("%d",an[i]);
else if(an[i]){
flag=true;
printf("%d",an[i]);
}
}
int sp=-1;
for(i=Maxn-1;i>=0;i--){
if(ann[i]){
sp=i;
break;
}
}
if(sp==-1){
puts("");
continue;
}
else{
printf(".");
for(i=0;i<=sp;i++)
printf("%d",ann[i]);
}
puts("");
}
return 0;
}
这里代码看起来还有点长,伱要是知道了有哪些情况,肿么对付的话,就是一道简单模拟题,如果伱有更好的方法的话,希望大家分享分享!