您的位置:首页 > 编程语言 > C语言/C++

C语言数组实现读入.txt各行超长整数小数相加并输出.txt

2018-10-20 11:34 246 查看

C语言数组实现读入.txt各行超长整数小数相加并输出.txt

算是作为一个新手吧,这个代码因为一些语法错误以及情况考虑不周全因素导致调了很久,写的很繁琐,但是还是放在这里留念一下,具体我有在别的博客看到很简洁实现的,有需要的可以去找一下。第一次在CSDN写,还有点小激动,希望以后自己继续努力!(代码变量命名以及其他写得不好的地方,还望海涵)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main()
{
char a[10000],b[10000],sum[10000];

FILE *fin, *fout;
fin = fopen("Testdata_1.txt","r");   //要读入计算的txt文档
fout = fopen("result.txt","w");     //输出存储的txt文档

fscanf(fin,"%s",&a);
fscanf(fin,"%s",&b);

while(!feof(fin))
{
int la,lb,ls,i,max;
int b1,b2;
b1 = b2 = 0;
int t1 = 0;
int t2 = 0;
char temp,tmp;

la = strlen(a);
lb = strlen(b);

//掐头去尾,去掉数据开头的‘0’以及小数点末尾的‘0’
//掐头
int zeronum=0;

if(a[0]=='0')
{
zeronum++;
}
for(i=0;i<la;i++)
{
if(a[i]=='0'&&a[i+1]=='0')
{
zeronum++;
}
else
{
i=la+1;
}
}

if(zeronum!=0)
{
for(i=0;i<la-zeronum;i++)
{
a[i]=a[i+zeronum];
}
a[i]='\0';
}

int zeronum2=0;
if(b[0]=='0')
{
zeronum2++;
}
for(i=0;i<lb;i++)
{
if(b[i]=='0'&&b[i+1]=='0')
{
zeronum2++;
}
else
{
i=lb+1;
}
}

if(zeronum2!=0)
{
for(i=0;i<lb-zeronum2;i++)
{
b[i]=b[i+zeronum2];
}
b[i]='\0';
}
la = la-zeronum;
lb = lb-zeronum2;

//去尾

int jud=0;
int jud2=0;
char temp2;
for(i=0;i<la;i++)
{
temp2 = a[i];
if(temp2 == '.')
{
jud=1;
}
}

for(i=0;i<lb;i++)
{
temp2 = b[i];
if(temp2 == '.')
{
jud2=1;
}
}
if(jud==1)
{
int tail=0;
if(a[la-1]=='0')
{
tail++;
}

for(i=la-1;i>0;i--)
{
if(a[i]=='0'&&a[i-1]=='0')
{
tail++;
}
else
{
i=0;
}
}

if(tail!=0)
{
a[la-tail]='\0';
}
la = la-tail;
}

if(jud2==1)
{
int tail2=0;
if(b[lb-1]=='0')
{
tail2++;
}

for(i=lb-1;i>0;i--)
{
if(b[i]=='0'&&b[i-1]=='0')
{
tail2++;
}
else
{
i=0;
}
}

if(tail2!=0)
{
b[lb-tail2]='\0';
}

lb = lb-tail2;
}   //掐头去尾部分结束

//判断整数整数相加judge==0,整数小数相加judge==1,小数小数相加部分judge==2

for(i=0;i<la;i++)
{
temp = a[i];
if(temp == '.')
{
b1 = 1;
t1 = i;
}
}

for(i=0;i<lb;i++)
{
temp = b[i];
if(temp == '.')
{
b2 = 1;
t2 = i;
}
}
int judge = b1 + b2;

//整数相加

if(judge == 0)
{
for(i=0;i<la/2;i++)
{
tmp=a[i];
a[i]=a[la-1-i];
a[la-1-i]=tmp;
}
for(i=0;i<lb/2;i++)
{
tmp=b[i];
b[i]=b[lb-1-i];
b[lb-1-i]=tmp;
}
if(la>lb)
{
max=la;
for(i=lb;i<max;i++)
b[i]='0';
b[max]='\0';
}
else
{
max=lb;
for(i=la;i<max;i++)
a[i]='0';
a[max]='\0';
}
for (i=0;i<=max;i++)
sum[i]='0';
for(i=0;i<max;i++)
{
sum[i]+=a[i]+b[i]-'0'-'0';
if(sum[i]>'9')
{
sum[i]-=10;
sum[i+1]+=1;
}
}
if(sum[max]>'0')
{
sum[max+1]='\0';
ls=max+1;
}
else
{
sum[max]='\0';
ls=max;
}
for(i=0;i<ls/2;i++)
{
tmp=sum[i];
sum[i]=sum[ls-i-1];
sum[ls-i-1]=tmp;
}

fprintf(fout,"%s\n",sum);

a[0]='\0';
b[0]='\0';
sum[0]='\0';

fscanf(fin,"%s",&a);
fscanf(fin,"%s",&b);
}

//整数和一个小数相加

else if(judge == 1)
{
char mid[10000],sum[10000];
int j=0;
if(t1==0)
{
for(i=t2;i<lb;i++)
{
mid[j] = b[i];
j++;
}
mid[j]='\0';
b[t2]='\0';
lb = t2;
}
else if(t2==0)
{
for(i=t1;i<la;i++)
{
mid[j] = a[i];
j++;
}
mid[j]='\0';
a[t1]='\0';
la = t1;
}
for(i=0;i<la/2;i++)
{
tmp=a[i];
a[i]=a[la-1-i];
a[la-1-i]=tmp;
}
for(i=0;i<lb/2;i++)
{
tmp=b[i];
b[i]=b[lb-1-i];
b[lb-1-i]=tmp;
}
if(la>lb)
{
max=la;
for(i=lb;i<max;i++)
b[i]='0';
b[max]='\0';
}
else
{
max=lb;
for(i=la;i<max;i++)
a[i]='0';
a[max]='\0';
}
for (i=0;i<=max;i++)
sum[i]='0';
for(i=0;i<max;i++)
{
sum[i]+=a[i]+b[i]-'0'-'0';
if(sum[i]>'9')
{
sum[i]-=10;
sum[i+1]+=1;
}
}
if(sum[max]>'0')
{
sum[max+1]='\0';
ls=max+1;
}
else
{
sum[max]='\0';
ls=max;
}
for(i=0;i<ls/2;i++)
{
tmp=sum[i];
sum[i]=sum[ls-i-1];
sum[ls-i-1]=tmp;
}

fprintf(fout,"%s",sum);
fprintf(fout,"%s\n",mid);

a[0]='\0';
b[0]='\0';
sum[0]='\0';
mid[0]='\0';

fscanf(fin,"%s",&a);
fscanf(fin,"%s",&b);
}

//两个小数相加

else if(judge == 2)
{
char mid1[10000];
char mid2[10000];
char sum2[10000];
int j=0;
int ls2;

//把小数位的数字部分存下来,并相加
for(i=t1+1;i<la;i++)
{
mid1[j] = a[i];
j++;
}
mid1[j]='\0';
a[t1]='\0';
la = t1;

j=0;
for(i=t2+1;i<lb;i++)
{
mid2[j] = b[i];
j++;
}
mid2[j]='\0';
b[t2]='\0';
lb = t2;

int l1 = strlen(mid1);
int l2 = strlen(mid2);

if(l1>l2)
{
max=l1;
for(i=l2;i<max;i++)
mid2[i]='0';
mid2[max]='\0';
}
else
{
max=l2;
for(i=l1;i<max;i++)
mid1[i]='0';
mid1[max]='\0';
}

for(i=0;i<max/2;i++)
{
tmp=mid1[i];
mid1[i]=mid1[max-1-i];
mid1[max-1-i]=tmp;
}
for(i=0;i<max/2;i++)
{
tmp=mid2[i];
mid2[i]=mid2[max-1-i];
mid2[max-1-i]=tmp;
}

for (i=0;i<=max;i++)
sum2[i]='0';

int  mark = 0;     //标记小数部分相加有没有进位的

for(i=0;i<max;i++)
{
sum2[i]+=mid1[i]+mid2[i]-'0'-'0';
if(sum2[i]>'9')
{
sum2[i]-=10;
sum2[i+1]+=1;
}
}

if(sum2[max]>'0')
{
sum2[max]='\0';
ls2=max;
mark = 1;
}
else
{
sum2[max]='\0';
ls2=max;
}

for(i=0;i<ls2/2;i++)
{
tmp=sum2[i];
sum2[i]=sum2[ls2-i-1];
sum2[ls2-i-1]=tmp;
}

//整数部分相加
for(i=0;i<la/2;i++)
{
tmp=a[i];
a[i]=a[la-1-i];
a[la-1-i]=tmp;
}
for(i=0;i<lb/2;i++)
{
tmp=b[i];
b[i]=b[lb-1-i];
b[lb-1-i]=tmp;
}
if(la>lb)
{
max=la;
for(i=lb;i<max;i++)
b[i]='0';
b[max]='\0';
}
else
{
max=lb;
for(i=la;i<max;i++)
a[i]='0';
a[max]='\0';
}
for (i=0;i<=max;i++)
sum[i]='0';
for(i=0;i<max;i++)
{
sum[i]+=a[i]+b[i]-'0'-'0';
if(sum[i]>'9')
{
sum[i]-=10;
sum[i+1]+=1;
}
}
if(sum[max]>'0')
{
sum[max+1]='\0';
ls=max+1;
}
else
{
sum[max]='\0';
ls=max;
}

//判断小数部位是否进1,并执行相应操作
if(mark==0)
{
for(i=0;i<ls/2;i++)
{
tmp=sum[i];
sum[i]=sum[ls-i-1];
sum[ls-i-1]=tmp;
}

fprintf(fout,"%s",sum);
fprintf(fout,"%c",'.');
fprintf(fout,"%s\n",sum2);
}

else if(mark==1)
{
char final[10000],fsum[10000];
int fls;
max=ls;
final[0]='1';
for(i=1;i<max;i++)
final[i]='0';
final[max]='\0';

for(i=0;i<=max;i++)
fsum[i]='0';

for(i=0;i<max;i++)
{
fsum[i]+=sum[i]+final[i]-'0'-'0';
if(fsum[i]>'9')
{
fsum[i]-=10;
fsum[i+1]+=1;
}
}
if(fsum[max]>'0')
{
fsum[max+1]='\0';
fls=max+1;
}
else
{
fsum[max]='\0';
fls=max;
}

for(i=0;i<fls/2;i++)
{
tmp=fsum[i];
fsum[i]=fsum[fls-i-1];
fsum[fls-i-1]=tmp;
}

fprintf(fout,"%s",fsum);
fprintf(fout,"%c",'.');
fprintf(fout,"%s\n",sum2);

final[0]='\0';
fsum[0]='\0';
}

else
{
printf("wrong!");
}

a[0]='\0';
b[0]='\0';
sum[0]='\0';
sum2[0]='\0';
mid1[0]='\0';
mid2[0]='\0';

fscanf(fin,"%s",&a);
fscanf(fin,"%s",&b);
}

//else

else
{
printf("wrong");
}
}

fclose(fin);
fclose(fout);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐