HDU 1753 大明A+B(大数相加)(string::npos)
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 题意:小明啊你以为你换个马甲我就不认识你了嘛!!! 解题思路: 有三种情况: 处理数据之前判断一下这个数是整数还是小数,分情况处理。 下面开始模拟: 计算:分为整数部分计算和小数部分计算。先进行小数部分计算,方便这种情况:如果有小数部分进位到整数部分则整数部分的个位数+1就行了。 输出:按顺序输出,先输出整数部分,再输出小数部分。输出小数部分之前先判断一下是否存在小数部分(如果小数部分全为0那就是不存在了)。如果存在还有一种特殊情况,如:12.3458+6.7002=19.0460。最后一个0当然是多余的,怎么处理呢?在这里是先把小数部分n[]数组倒过来判断一下,如果末位有多余的0则小数部分的长度就随之减少,这样输出的时候输到0之前就结束了。详见代码。 这里说一下string容器。
这个返回值有些特殊,见下:
我分别在同一个编译器上做了两个实验,第一个是在数字中查找小数点的位置,结果找不到都是返回-1,第二是照着书上打的,找不到结果却返回了第二个值18446744073709551615,但是这三个值都是无符号型。(具体-1怎样当做无符号型的不再多说) 但是对于这道题其实for循环就可以了。。 真的不想再多做一遍。。。 总之,还是自己水平太低了。。。 AC代码: #include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
using namespace std;
string aa,bb;
char a[410],b[410];
int main()
{
int i,j,p,q,r,s,pos1,pos2,l,h;
int c[410],d[410],e[410],f[410],m[410],n[410];
while(~scanf("%s%s",a,b))
{
memset(c,0,sizeof(c));
memset(d,sizeof(d));
memset(e,sizeof(e));
memset(f,sizeof(f));
memset(m,sizeof(m));
memset(n,sizeof(n));
aa=a;
bb=b;
l=strlen(a);
h=strlen(b);
pos1=aa.find(".");
pos2=bb.find(".");
//处理数据
if(pos1==-1)
{
for(i=l-1,p=0;i>=0;i--)
{
c[p++]=a[i]-'0';
}
q=1;
d[0]=0;
}
else
{
for(i=pos1-1,p=0;i>=0;i--)
{
c[p++]=a[i]-'0';
}
for(i=pos1+1,q=0;i<l;i++)
{
d[q++]=a[i]-'0';
}
}
if(pos2==-1)
{
for(i=h-1,r=0;i>=0;i--)
{
e[r++]=b[i]-'0';
}
s=1;
f[0]=0;
}
else
{
for(i=pos2-1,r=0;i>=0;i--)
{
e[r++]=b[i]-'0';
}
for(i=pos2+1,s=0;i<h;i++)
{
f[s++]=b[i]-'0';
}
}
//计算
int max1=(p>r)?p:r;
int max2=(q>s)?q:s;
//小数部分
for(i=max2-1;i>=1;i--)
{
n[i]=d[i]+f[i];
if(n[i]>=10) {n[i]-=10;d[i-1]++;}
}
n[0]=d[0]+f[0];
if(n[0]>=10) {n[0]-=10;c[0]++;}
//整数部分
for(i=0;i<max1-1;i++)
{
m[i]=c[i]+e[i];
if(m[i]>=10) {m[i]-=10;c[i+1]++;}
}
m[max1-1]=c[max1-1]+e[max1-1];
//输出结果
//输出整数部分
for(i=max1-1;i>=0;i--)
{
printf("%d",m[i]);
}
//判断有没有小数部分
int flag=0;
for(i=0;i<max2;i++)
{
if(n[i]!=0) flag=1;//如果小数部分有值
}
//输出小数部分
if(flag==0) printf("n");
else
{
printf(".");
for(i=max2-1;i>=0;i--)//处理后缀0!
{
if(n[i]!=0) break;
if(n[i]==0) max2--;
}
for(i=0;i<max2;i++)
{
printf("%d",n[i]);
}
printf("n");
}
}
return 0;
}
(艰辛的调教过程版。。) #include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
using namespace std;
string aa,bb;
char a[410],q,s,m[410],n[410];
while(~scanf("%s%s",b))
{
memset(c,sizeof(c));
memset(d,sizeof(d));
memset(e,sizeof(e));
memset(f,sizeof(f));
memset(m,sizeof(m));
memset(n,sizeof(n));
aa=a;
bb=b;
l=strlen(a);
h=strlen(b);
pos1=aa.find(".");
pos2=bb.find(".");
//printf("pos1===%dnpos2===%dn",pos2);
//if(s.find("a") == string::npos)string::npos通用处理
//处理数据
if(pos1==-1)
{
for(i=l-1,p=0;i>=0;i--)
{
c[p++]=a[i]-'0';
}
q=1;
d[0]=0;
}
else
{
for(i=pos1-1,q=0;i<l;i++)
{
d[q++]=a[i]-'0';
}
}
if(pos2==-1)
{
for(i=h-1,r=0;i>=0;i--)
{
e[r++]=b[i]-'0';
}
s=1;
f[0]=0;
}
else
{
for(i=pos2-1,s=0;i<h;i++)
{
f[s++]=b[i]-'0';
}
}
/*
printf("************n");
for(i=0;i<p;i++)
printf("%d",c[i]);
printf("n");
for(i=0;i<q;i++)
printf("%d",d[i]);
printf("n");
for(i=0;i<r;i++)
printf("%d",e[i]);
printf("n");
for(i=0;i<s;i++)
printf("%d",f[i]);
printf("n");
printf("************n");
*/
//计算
int max1=(p>r)?p:r;
int max2=(q>s)?q:s;
/* printf("max1===%dnmax2===%dn",max1,max2); printf("************n"); printf("f[2]===%dn",f[2]); printf("d[2]+f[2]===%dn",d[2]+f[2]); printf("d[1]+f[1]===%dn",d[1]+f[1]); printf("d[0]+f[0]===%dn",d[0]+f[0]); */
//小数部分
for(i=max2-1;i>=1;i--)
{
n[i]=d[i]+f[i];
//printf("n[%d]===%dn",i,n[i]);
if(n[i]>=10) {n[i]-=10;d[i-1]++;}
}
n[0]=d[0]+f[0];
//printf("n[0]===%dn",n[0]);
if(n[0]>=10) {n[0]-=10;c[0]++;}
/*
printf("************n");
printf("************n");
for(i=0;i<max2;i++)
printf("%d",n[i]);
printf("n");
printf("************n");
*/
//printf("c[0]===%dn",c[0]);
//整数部分
for(i=0;i<max1-1;i++)
{
m[i]=c[i]+e[i];
//printf("m[%d]===%dn",m[i]);
if(m[i]>=10) {m[i]-=10;c[i+1]++;}
}
m[max1-1]=c[max1-1]+e[max1-1];
//输出结果
//输出整数部分
//if(m[max1])
//printf("c[max1-1]===%dne[max1-1]===%dn",c[max1-1],e[max1-1]);
//printf("m[max1-1]===%dn",m[max1-1]);
for(i=max1-1;i>=0;i--)
{
printf("%d",m[i]);
}
//判断有没有小数部分
int flag=0;
for(i=0;i<max2;i++)
{
if(n[i]!=0) flag=1;//如果小数部分有值
}
//输出小数部分
if(flag==0) printf("n");
else
{
printf(".");
for(i=max2-1;i>=0;i--)//处理后缀0!
{
if(n[i]!=0) break;
if(n[i]==0) max2--;
}
for(i=0;i<max2;i++)
{
printf("%d",n[i]);
}
printf("n");
}
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |