在上次的期末考试中又出现了大数相加减的问题,个人认为此类问题较为基础,且有一定的难度,但网上的代码大多是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;
}
本人刚接触编程,水平有限。希望能帮助更多像我一样的初学者更快了解大数处理问题的方法。也希望各位前辈多多指出代码中的不足