C语言实现高精度“加、减、乘”

本人C语言小白一枚,有不对的地方还请多指教

#include "stdio.h"
#include "string.h"
#define N 1000//便于后期处理
void HighPlus(char x1[],char x2[]);
void HighMinus(char x1[],char x2[]);
void HighMultiply(char x1[],char x2[]);
void Output(int a[],int n);
int compare(char a[],char b[]);
int main()
{
	char x1[N],x2[N];
	gets(x1);//保证读入的数字可以为高精度
	gets(x2);
	HighPlus(x1,x2);	//加
	HighMinus(x1,x2);	//减
	HighMultiply(x1,x2);//乘
	return 0;
}
void HighPlus(char x1[],char x2[])
{
	int i,j,n,n1=strlen(x1),n2=strlen(x2);
	int a[N]={0},b[N]={0};
	for(i=n1-1,j=0;i>=0;i--)
		a[j++]=x1[i]-'0';		//字符转整数
	for(i=n2-1,j=0;i>=0;i--)
		b[j++]=x2[i]-'0';		//字符转整数
	if(n1>n2)
		n=n1;
	else						//取高位数
		n=n2;
	for(i=0;n>i;i++)
	{
		a[i]+=b[i];
		a[i+1]+=a[i]/10;		//按位做加法
		a[i]=a[i]%10;
	}
	if(a[n]!=0)
		n=n+1;			//如果最高位进位,位数加一
	Output(a,n);
}
void HighMinus(char x1[],char x2[])
{
	int i,j=0,n,n1=strlen(x1),n2=strlen(x2);
	int a[N]={0},b[N]={0};
	for(i=n1-1,j=0;i>=0;i--)
		a[j++]=x1[i]-'0';		//字符转整数
	for(i=n2-1,j=0;i>=0;i--)
		b[j++]=x2[i]-'0';		//字符转整数
	if(compare(x1,x2)==1)		//判断谁大谁小
	{
		n=n1;
		for(i=0;n>i;i++)
		{
		a[i]-=b[i];
		if(a[i]<0)				//按位做减法
			a[i]+=10,a[i+1]--;
		}
		while(a[n-1]==0)		//去首位0
			n=n-1;
		Output(a,n);
	}
	else
	{
		n=n2;
		for(i=0;n>i;i++)
		{
			b[i]-=a[i];
			if(b[i]<0)					//a换为b即可
				b[i]+=10,b[i+1]--;
		}
		printf("-");
		while(b[n-1]==0)
			n=n-1;
		Output(b,n);
	}

}
void HighMultiply(char x1[],char x2[])
{
	int i,j=0,n,n1=strlen(x1),n2=strlen(x2);
	int a[N]={0},b[N]={0},c[1000]={0};
	for(i=n1,j=1;i>=1;i--)
		a[j++]=x1[i-1]-'0';							//字符转整数
	for(i=n2,j=1;i>0;i--)
		b[j++]=x2[i-1]-'0';							//字符转整数
	for(i=1;n1>=i;i++)
	{
		for(j=1;n2>=j;j++)
		{
			c[i+j-1]+=a[i]*b[j];	//按位乘,同时错位相加
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
		n=i+j;
		while(c[n]==0&&n>1)
			n--;				//除首位0
	for(i=n;i>=1;i--)
	{
		printf("%d",c[i]);
	}
}
void Output(int a[],int n)
{
	int i;
	for(i=n-1;i>=0;i--)
	printf("%d",a[i]);
}
int compare(char a[],char b[])
{
	if(strlen(a)>strlen(b))
		return 1;
	if(strlen(a)<strlen(b))
		return 0;
	if(strcmp(a,b)>0)
		return 1;
	return 0;
}

感谢围观,如果有用的话点个赞再走吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值