您的位置:首页 > 其它

大数

2016-04-06 19:58 351 查看
ps:实现是实现了,但错误未知,甚用。

ps:代码有点臃肿,凑和用着。

ps:能用java就用java,其次手写,最后套用这个。

整数:

1.int数组

/*
小数大数,加法
char数组实现
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

void plu(char *a,char *b){//注意存储方式:整数倒着存,小数正着存,看代码需注意
int i,j,k,lena,lenb,lena1,lena2,lenb1,lenb2,lenc1,lenc2;//len分别对应相应数组的长度
char a1[1024],a2[1024],b1[1024],b2[1024],c1[1024],c2[1024];//a1、a2为第一个数的整数部分、小数部分
lena=strlen(a);//b1、b2为第二个数;c1、c2为结果
lenb=strlen(b);
//取出第1个数的整数部分、小数部分
for(i=0;i<lena;++i)
if(a[i]=='.')
break;
lena1=i;
lena2=lena-i-1;
for(j=i-1,k=0;j>=0;--j)
a1[k++]=a[j];
for(j=i+1,k=0;j<lena;++j)
a2[k++]=a[j];

//取出第2个数的整数部分、小数部分
for(i=0;i<lenb;++i)
if(b[i]=='.')
break;
lenb1=i;
lenb2=lenb-i-1;
for(j=i-1,k=0;j>=0;--j)
b1[k++]=b[j];
for(j=i+1,k=0;j<lenb;++j)
b2[k++]=b[j];

//开始计算
int up=0;//进位
//计算小数部分
if(lena2>lenb2){
lenc2=lena2;
for(i=lena2-1;i>=lenb2;--i)
c2[i]=a2[i];
for(;i>=0;--i){
c2[i]=a2[i]+b2[i]-'0'+up;
if(c2[i]>'9'){
up=1;
c2[i]-=10;
}
else up=0;
}
}
else{
lenc2=lenb2;
for(i=lenb2-1;i>=lena2;--i)
c2[i]=b2[i];
for(;i>=0;--i){
c2[i]=a2[i]+b2[i]-'0'+up;
if(c2[i]>'9'){
up=1;
c2[i]-=10;
}
else up=0;
}
}
while(c2[lenc2-1]=='0'&&lenc2>=1)--lenc2;//去除后面多余的0
//计算整数部分
if(lena1>lenb1){
lenc1=lena1;
for(i=0;i<lenb1;++i){
c1[i]=a1[i]+b1[i]-'0'+up;
if(c1[i]>'9'){
up=1;
c1[i]-=10;
}
else up=0;
}
for(;i<lena1;++i){
c1[i]=a1[i]+up;
if(c1[i]>'9'){
up=1;
c1[i]-=10;
}
else up=0;
}
}
else{
lenc1=lenb1;
for(i=0;i<lena1;++i){
c1[i]=a1[i]+b1[i]-'0'+up;
if(c1[i]>'9'){
up=1;
c1[i]-=10;
}
else up=0;
}
for(;i<lenb1;++i){
c1[i]=b1[i]+up;
if(c1[i]>'9'){
up=1;
c1[i]-=10;
}
else up=0;
}
}

if(up==1)printf("1");//最后有进位

for(i=lenc1-1;i>=0;--i)
printf("%c",c1[i]);

if(lenc2>0){
printf(".");
for(i=0;i<lenc2;++i)
printf("%c",c2[i]);
}
printf("\n");
}

int main(){
char a[1024],b[1024];
while(~scanf("%s%s",a,b))
plu(a,b);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: