C++之高精度算法

高精度算发之加减乘除

加法

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
	char a1[100],b1[100];
  	int a[100],b[100],c[100],lena,lenb,lenc,i,x;
  	memset(a,0,sizeof(a));
  	memset(b,0,sizeof(b));
  	memset(c,0,sizeof(c));
  	gets(a1);
 	gets(b1);//输入加数与被加数
  	lena=strlen(a1);
  	lenb=strlen(b1);
  	for(i=0;i<=lena-1;i++){
		a[lena-i]=a1[i]-48;}//加数放入a数组
	for(i=0;i<=lenb-1;i++){
		b[lenb-i]=b1[i]-48;}//加数放入b数组
		
  	lenc =1;
  	x=0;
	while (lenc<=lena||lenc<=lenb){
		c[lenc]=a[lenc]+b[lenc]+x;//两数相加
		x=c[lenc]/10;
		c[lenc]%=10;
		lenc++;
	}
	c[lenc]=x; 
	if (c[lenc]==0)
		lenc--;//处理最高进位
	for (i=lenc;i>=1;i--) //输出结果
	cout<<c[i];
	cout<<endl;
	return 0;
} 

减法

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
	int a[256],b[256],c[256],lena,lenb,lenc,i;
	char n[256],n1[256],n2[256];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	printf("Input minuend:");    
	gets(n1);   //输入被减数
	printf("Input subtrahend:"); 
	gets(n2);   //输入减数
	//strcmp()为字符串比较函数,当n1==n2, 返回0;
	//n1>n2时,返回正整数;n1<n2时,返回负整数
	//处理被减数和减数,交换被减数和减数
	if (strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0)){
		strcpy(n,n1);                //将n1数组的值完全赋值给n数组
		strcpy(n1,n2);
		strcpy(n2,n);
		cout<<"-"; }                   //交换了减数和被减数,结果为负数  
		lena=strlen(n1); lenb=strlen(n2);
	for(i=0;i<=lena-1;i++) a[lena-i]=int(n1[i]-'0');  //被减数放入a数组
	for(i=0;i<=lenb-1;i++) b[lenb-i]=int(n2[i]-'0');  //减数放入b数组
	i=1;
	while (i<=lena||i<=lenb){
		if (a[i]<b[i]){
			a[i]+=10;               //不够减,那么向高位借1当10
			a[i+1]--;
		}
		c[i]=a[i]-b[i];                        //对应位相减
		i++;
	}
	lenc=i;
	while ((c[lenc]==0)&&(lenc>1)) lenc--;   //最高位的0不输出    
	for (i=lenc;i>=1;i--) cout<<c[i];               //输出结果
	cout<<endl;
	return 0;
}

乘法

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    char a1[100],b1[100];
    int a[100],b[100],c[100],lena,lenb,lenc,i,j,x;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    gets(a1);gets(b1);
    lena=strlen(a1);lenb=strlen(b1);
    for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;
    for (i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;
  	for (i=1;i<=lena;i++)
	{
	     x=0;                                               //用于存放进位
	     for (j=1;j<=lenb;j++)                     //对乘数的每一位进行处理
	     {
		   c[i+j-1]=a[i]*b[j]+x+c[i+j-1]; //当前乘积+上次乘积进位+原数
		   x=c[i+j-1]/10;
		   c[i+j-1]%=10;
	     }
	     c[i+lenb]=x;                                  //进位
	}
	lenc=lena+lenb;
	//cout<<c[lenc]<<"tt"<<endl;
	while (c[lenc]==0&&lenc>1)       //删除前导0
		lenc--;
	for (i=lenc;i>=1;i--)
		cout<<c[i];
	cout<<endl;
	return 0;
}
	

除法

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
	char a1[100],c1[100];
  	int a[100],c[100],lena,i,x=0,lenc,b;
  	memset(a,0,sizeof(a));
  	memset(c,0,sizeof(c));
  	gets(a1);
  	cin>>b;
  	lena=strlen(a1);
  	for (i=0;i<=lena-1;i++)
		a[i+1]=a1[i]-48;
	for (i=1;i<=lena;i++){//按位相除
		c[i]=(x*10+a[i])/b;
	    x=(x*10+a[i])%b;
	}
	lenc=1;
    while(c[lenc]==0&&lenc<lena) 
		lenc++;//删除前导0
    for(i=lenc;i<=lena;i++) 
    	cout<<c[i];
    	cout<<endl;
    		return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值