高精度计算

今天学了高精度计算,感觉几乎所有算法都差不多,下面是加法与减法的代码,结合poj1503:

//高精度计算
//加法
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Max 100
#define Maxn(a,b) (a)>(b)?(a):(b)
int an1[Max+10];
int an2[Max+10];
char ch[Max+10];

void Addition(int *a1,int &len1,int *a2,int len2);
int check(int *a1,int len);
int main()
{
	an1[0]=0;
	int len1=1;
	int i,j;
	while(scanf("%s",ch)!=EOF)
	{
		if(strcmp(ch,"0")==0)
			break;
		int Len=strlen(ch);
		for(i=0,j=0;i<Len;i++)
			an2[j++]=ch[Len-i-1]-'0';
		Addition(an1,len1,an2,j);
	}
	for(i=len1-1;i>=0;i--)
		printf("%d",an1[i]);
	return 0;
}

void Addition(int *a1,int &len1,int *a2,int len2)
{
	int Len=Maxn(len1,len2),i;
	for(i=len1;i<=Len;i++)
		a1[i]=0;
	for(i=len2;i<=Len;i++)
		a2[i]=0;
	for(i=0;i<Len;i++)
		a1[i]+=a2[i];
	len1=check(a1,Len);
}	

int check(int *a1,int len)
{
	for(int i=0;i<len;i++)
	{
		if(a1[i]>9)
		{
			a1[i+1]+=a1[i]/10;
			a1[i]%=10;
		}
	}
	if(a1[len]!=0)
		return len+1;
	return len;
}

		
		
			
		
		


 

高精度减法:

//高精度减法(两个数)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Max 100
#define Maxn(a,b) (a)>(b)?(a):(b)
char ch1[Max+10];
char ch2[Max+10];
int an1[Max+10];
int an2[Max+10];
int Subtract(int *a1,int len1,int *a2,int len2);
int main()
{
	int i,j,len1,len2;
	while(scanf("%s%s",ch1,ch2)!=EOF)
	{
		if(strcmp(ch1,"0")==0)
			break;
		len1=strlen(ch1);
		len2=strlen(ch2);
        for(i=len1-1,j=0;i>=0;i--)
            an1[j++]=ch1[i];
        for(i=len2-1,j=0;i>=0;i--)
			an2[j++]=ch2[i];
		switch(Subtract(an1,len1,an2,len2))
		{
	case -1:printf("wrong\n"); break;
	case 0: printf("0\n");break;
    default: 
	  for(i=len1-1;i>=0;i--)
		  printf("%d",an1[i]);
	  printf("\n");
		}
	}
	return 0;
}

int Subtract(int *a1,int len1,int *a2,int len2)
{
	int i;
	if(len1<len2)
		return -1;
	for(i=len2;i<len1;i++)
		a2[i]=0;
	for(i=len1-1;i>=0;i--)
	{
		if(a1[i]<a2[i])
			return -1;
		else if(a1[i]>a2[i])
			break;
	}
	if(i<0)
		return 0;
	for(i=0;i<len1;i++)
	{
		a1[i]-=a2[i];
		if(a1[i]<0)
		{
			a1[i+1]-=1;
			a1[i]+=10;
		}
	}
	return 1;
}

	
乘法:poj2389
代码:
//高精度乘法
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

#define Max 200
char ch1[Max+10];
char ch2[Max+10];
int an1[Max];
int an2[Max];
int an[2*Max];
void Multiply(int *an1,int *an2);
int main()
{
	int i,j;
	scanf("%s%s",ch1,ch2);
	int len1=strlen(ch1);
	int len2=strlen(ch2);
	memset(an2,0,sizeof(an2));
	memset(an1,0,sizeof(an1));
	memset(an,0,sizeof(an));
	for(i=len1-1,j=0;i>=0;i--)
		an1[j++]=ch1[i]-'0';
//	for(i=0;i<j;i++)
//		cout << an1[i];
	for(i=len2-1,j=0;i>=0;i--)
		an2[j++]=ch2[i]-'0';
	Multiply(an1,an2);
	for(i=2*Max-1;an[i]==0 && i>=0;i--);
	if(i<0)
		printf("0\n");
	else
	{
		for( ;i>=0;i--)
			printf("%d",an[i]);
		printf("\n");
	}
	return 0;
}

void Multiply(int *an1,int *an2)
{
	int i,j;
	for(i=0;i<Max;i++)
		for(j=0;j<Max;j++)
			an[i+j]+=an1[i]*an2[j];
		for(i=0;i<2*Max;i++)
			if(an[i]>9)
			{
				an[i+1]+=an[i]/10;
				an[i]%=10;
			}
}
//高精度除法
//Substract--array
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Max 200
char ch1[Max+10];
char ch2[Max+10];
int an1[Max+10];
int an2[Max+10];
int an[Max+10];
int n;
int Substract(int *a1,int *a2,int len1,int len2);
int main()
{
	scanf("%d",&n);
	int i,j,len1,len2;
	int t;
	while(n--)
	{
		scanf("%s%s",ch1,ch2);
		if(ch2[0]=='0'){
			printf("wrong\n");
			continue;
		}
		len1=strlen(ch1);
		len2=strlen(ch2);
		if(len1<len2)
		{
			
			printf("0\n");
			continue;
		}
		//memset(an1,0,sizeof(an1));
		memset(an2,0,sizeof(an2));
		memset(an,0,sizeof(an));
		for(i=len1-1,j=0;i>=0;i--)
			an1[j++]=ch1[i]-'0';
		for(i=len2-1,j=0;i>=0;i--)
			an2[j++]=ch2[i]-'0';
		int ntime=len1-len2;
		if(ntime>0)
		{
			for(i=len1-1;i>=len2;i--)
				an2[i]=an2[i-ntime];
			for( ;i>=0;i--)
				an2[i]=0;
			len2=len1;
		}
		for(i=0;i<=ntime;i++)
		{
			while((t=Substract(an1,an2+i,len1,len2-i))>=0)
			{
				
				len1=t;
				an[ntime-i]++;
			}
		}
		for(i=Max+9;i>=0;i--)
			if(an[i])
				break;
			if(i>=0)
				for( ;i>=0;i--)
					printf("%d",an[i]);
				else
					printf("0");
				printf("\n");
	}
	return 0;
}

int Substract(int *a1,int *a2,int len1,int len2)
{
	int i;
	if(len1<len2)
		return -1;

	  if(len1==len2)
	   {
		   for(i=len1-1;i>=0;i--)
			   if(a1[i]>a2[i])
				   break;
			   else if(a1[i]<a2[i])
				   return -1;
	   }
	   for(i=0;i<len1;i++)
	   {
		   a1[i]=a1[i]-a2[i];  
		   if(a1[i]<0)
		   {
			   a1[i+1]--;
			   a1[i]+=10;
		   }
	   }
	   for(i=len1-1;i>=0;i--)
		   if(a1[i])
			   return i+1;
	  return 0;
}
以上就是最基本的高精度算法了,当然还有其他的类型不过总体的解决办法大同小异。。。。


 

明天继续给出除法与乘法的高精度代码。。。。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值