大数的加法运算:
大数的加法就是利用字符串输入然后转化为两个数组,然后相加存入另一个数组,如果大于10就要进一。
程序代码:
#include<stdio.h>
#include<string.h>
char s1[5000],s2[5000];
int a[5000],b[5000],c[10000];
int main()
{
int i,j,k,n,m,t;
while(scanf("%s%s",s1,s2)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=strlen(s1);
m=strlen(s2);
k=0;
for(i=n-1;i>=0;i--)
a[k++]=s1[i]-'0';
k=0;
for(i=m-1;i>=0;i--)
b[k++]=s2[i]-'0';
if(n<m)
k=m;
else
k=n;
t=k;
for(i=0;i<k;i++)
{
c[i]=a[i]+b[i]+c[i];
if(c[i]>=10)
{
c[i]=c[i]%10;
c[i+1]=1;
if(i+1==k)
t=k+1;
}
}
for(i=t-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}
大数减法:
大数减法要保证大的减去小的,然后先比较大小写一个函数利用减法运算,运算时减不够的前位减1,后位加10.
程序代码:
#include<stdio.h>
#include<string.h>
char s[5000],s1[50000];
int a[50000],b[50000],c[50000];
void sub(int x[],int y[],int z)
{
int i;
for(i=0;i<z;i++)
{
c[i]=x[i]-y[i]+c[i];
if(c[i]<0)
{
c[i]=10+c[i];
c[i+1]=-1;
}
}
for(i=z-1;i>=0;i--)
{
if(c[i]==0)
z--;
else
break;
}
for(i=z-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
int main()
{
int i,j,k,n,m,t;
while(scanf("%s%s",s,s1)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=strlen(s);
m=strlen(s1);
k=0;
for(i=n-1;i>=0;i--)
a[k++]=s[i]-'0';
k=0;
for(i=m-1;i>=0;i--)
b[k++]=s1[i]-'0';
if(n>m)
sub(a,b,n);
else if(n<m)
{
printf("-");
sub(b,a,m);
}
else
{
for(i=0;i<n;i++)
{
if(a[i]==b[i])
continue;
else if(a[i]>b[i])
{
sub(a,b,n);
break;
}
else
{
printf("-");
sub(b,a,n);
break;
}
}
}
}
return 0;
}
大数乘法:
大数乘法跟大数加法类似,先乘后加,就是让每一次乘得的结果先存储到数组里面,因为两个数相乘最大位数也不过两个数的长度。
程序代码:
#include<stdio.h>
#include<string.h>
char s[5000],s1[5000];
int a[5000],b[5000],c[5000];
int main()
{
int i,j,k,t,n,m,sum;
while(scanf("%s%s",s,s1)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=strlen(s);
m=strlen(s1);
sum=n+m;
k=0;
for(i=n-1;i>=0;i--)
a[k++]=s[i]-'0';
k=0;
for(i=m-1;i>=0;i--)
b[k++]=s1[i]-'0';
for(i=0;i<n;i++)
for(j=0;j<m;j++)
c[i+j]=c[i+j]+a[i]*b[j];
for(i=0;i<sum;i++)
{
if(c[i]>=10)
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
for(i=sum-1;i>0;i--)
{
if(c[i]==0)
continue;
else
break;
}
while(i>=0)
{
printf("%d",c[i]);
i--;
}
printf("\n");
}
return 0;
}
大数幂:
大数幂也可以看成是大数乘法,可以把每一次乘得的结果作为每一次底数乘对象,然后循环n-1次。
程序代码:
#include<stdio.h>
#include<string.h>
char s[20];
int a[500000],b[500000];
int count=0;
void cheng(int a[],int b[],int m);
int main()
{
int i,k,j,n,m;
while(scanf("%s%d",s,&n)!=EOF)
{
if(s[0]=='0'&&n==0)
break;
if(n==0)
{
printf("1\n");
continue;
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
m=strlen(s);
j=k=0;
for(i=m-1;i>=0;i--)
{
a[k++]=s[i]-'0';
b[j++]=s[i]-'0';
}
n--;
while(n)
{
cheng(a,b,m);
n--;
}
for(i=1005;i>0;i--)
{
if(b[i]==0)
continue;
else
break;
}
while(i>=0)
{
printf("%d",b[i]);
i--;
}
printf("\n");
}
return 0;
}
void cheng(int a[],int b[],int m)
{
int i,j,k;
int c[5000];
memset(c,0,sizeof(c));
for(i=0;i<m;i++)
for(j=0;j<1005;j++)
{
c[i+j]=c[i+j]+a[i]*b[j];
}
for(i=0;i<1005;i++)
{
if(c[i]>=10)
c[i+1]=c[i+1]+c[i]/10;
b[i]=c[i]%10;
}
}
大数除法:
这里由于大数除法比较麻烦,后面会接着有大数求余和大数阶层的时候详细讲解, 见谅!!!!!