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; }
相关文章推荐
- 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。
- C语言实现两个超大数组相加
- 利用C语言来实现交换两个变量的值,由终端输入两个整数给变量x、y,然后交换x和y的值后,输出x和y。 有不同的方法
- 【剑指offer】C语言:实现函数可以将一个字符串转换为对应的整数,如+1234输出1234
- c语言:3种方法实现输出一个整数的每一位。
- 用C语言实现判断两个数组中是否有相同的元素,有就输出“有”,没有则输出“没有”
- c语言之根据根据输入确定的整数n使得输出也要精确到小数n位
- 从键盘输入某个十进制小数或整数,转换成对应的二进制小数并输出。 (查询十进制小数转换成二进制小数的算法,使用循环来实现。 最多保留小数位后7位数字即可)算法
- C语言实现整数数组的逆置算法
- 以指针作为函数参数,读入三个浮点数,将数字的整数部分和小数部分分别输出
- 课堂提问(C语言):输入10个整数到一个数组,将奇数放在数组前面,偶数放在数组后面,然后输出整个数组。
- 从txt中读入数据到数组中(fscanf)的实现代码
- 两个超大整数相加之数组实现
- 读入文本文件data.txt中的整数,调用sort()对数组arr元素排序,最后显示出来
- 利用指针实现将5个整数输入到数组a中,然后将a逆序复制到数组b中,并输出b中各单元的值。
- 8.7 输入10个整数,用函数编程将其中最大数与最小数位置互换,然后输出互换后的数组
- 输入10个整数,用函数编程将其中最大数于最小数位置互换,然后输出互换后的数组。
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- c语言实现大整数相加相乘
- 【源码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)