大数的加、减、乘、除、幂运算(C语言)

大数的加法运算:
大数的加法就是利用字符串输入然后转化为两个数组,然后相加存入另一个数组,如果大于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;
	}
}

大数除法:
这里由于大数除法比较麻烦,后面会接着有大数求余和大数阶层的时候详细讲解, 见谅!!!!!

发布了67 篇原创文章 · 获赞 39 · 访问量 2737

猜你喜欢

转载自blog.csdn.net/qq_44859533/article/details/99712586