在上次的期末考试中又出现了大数相加减的问题,个人认为此类问题较为基础,且有一定的难度,但网上的代码大多是c++版本,特此发个大数处理问题c语言版本。相似的如大数相乘、大数的因式、大数阶乘等问题将在后面更新。
// HOUYI 2017.12.12 #include"stdio.h" #include"string.h" void add(char *p1,char *p2,int len1,int len2) //相加 { int i,j,k,t=0; for(i=len2-1,j=len1-1; i>=0; i--,j--)//循环保证小的数大于0 { k=p2[i]+p1[j]-'0'-'0'+t;//两个数对应位置的数相加并加上低位进位进的数值 //当数值大于等于10时,取个位数 if(k>=10) p1[j]=(k%10)+'0'; else p1[j]=k+'0'; t=k/10;//进位数值 } } //去前导零函数 char *dislodge(char*s) { char*p=s; int i; for(i=0; s[i]!='\0'; ++i) { //数值为0的情况 if(s[i+1]=='\0') break; //去掉前导0后不再该表位置 if(s[i]!='0') break; } p=&s[i]; return p; } int main() { char a[205],b[205]; int l1,l2; while(scanf("%s %s",a,b)!=EOF) { char *p1=a,*p2=b,*p; l1=strlen(a); l2=strlen(b); //大数放前面 if(l1>l2) { add(p1,p2,l1,l2); p=qdao(p1); } else { add(p2,p1,l2,l1); p=dislodge(p2); } printf("%s\n",p); memset(a,0,205); memset(b,0,205); } return 0; }
同样的大数相减的算法如下:
#include<stdio.h> #include<string.h> #include<math.h> //大数相减函数 char * subtract(char *s1,char *s2,int l1,int l2) { int i,j,t; for(i=l1-1,j=l2-1; j>=0; i--,j--) { t=s1[i]-s2[i]; if(t<0) { s1[i]=abs(t)+'0'; s1[i-1]=s1[i-1]-1; } else s1[i]=t+'0'; } return s1; } //去前导零函数 char* dislodge(char *s) { int i,l; l=strlen(s); for(i=0;i<l;i++) { //数值为0的情况 if(s[i+1]=='\0'); break; //当为前导0时不再改变位置 if(s[i]!='0'); break; } return &s[i]; } int main() { char str1[205],str2[205]; int len1,len2; char *p1,*p2; while(scanf("%s %s",str1,str2)!=EOF) { len1=strlen(str1); len2=strlen(str2); if(len1>len2) p1=subtract(str1,str2,len1,len2); else p1=subtract(str2,str1,len2,len1); p2=dislodge(p1); printf("%s\n",p2); memset(str1,0,205); memset(str2,0,205); } return 0; }
本人刚接触编程,水平有限。希望能帮助更多像我一样的初学者更快了解大数处理问题的方法。也希望各位前辈多多指出代码中的不足