⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hp.cpp

📁 高精度源程序
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#define Maxsize 30000

struct hp
{
    int len;
    int s[Maxsize+1];
};
typedef hp bignum;

void f_input(bignum &a, char *sa);
void f_plus(const bignum &a, const bignum &b, bignum &c);
void f_subtract(const bignum &a, const bignum &b, bignum &c);
void f_hdivision(const bignum &a, const bignum &b, bignum &c, bignum &d);
void f_hmultiply(const bignum &a, const bignum &b, bignum &c);
void f_print(const bignum &c);
void f_multiply10(bignum &a);
int f_cmp(const bignum &a, const bignum &b);

void f_multiply(const bignum &a, int n, bignum &c);
void f_division(const bignum &a, int n, bignum &c, int &residue);

int main()
{
	freopen("hp.txt","r",stdin);
	char sa[Maxsize+1],sb[Maxsize+1],op[10];
	bignum a,b,c,d;
	while((scanf("%s",sa)) != EOF && (scanf("%s",op)) != EOF && (scanf("%s",sb)) != EOF)
	{
		f_input(a,sa);
		f_input(b,sb);
		switch(op[0])
		{
		case '+': f_plus(a,b,c);
			break;
		case '-': f_subtract(a,b,c);
			break;
		case '*': f_hmultiply(a,b,c);
			break;
		case '%':
		case '/': f_hdivision(a,b,c,d);
			break;
		default: printf("\nOperator ERROR\n");
			break;
		}
		if(op[0] == '%')
			f_print(d);
		else
			f_print(c);
	}
	return (0);
}

void f_input(bignum &a, char *sa)
{
	int i;
	a.len=strlen(sa);
	for(i=1; i<=a.len; i++)
	{
		a.s[i]=sa[a.len-i]-'0';
	}
	for(i=a.len+1; i<=Maxsize; i++)
	{
		a.s[i]=0;
	}
}

void f_plus(const bignum &a, const bignum &b, bignum &c)
{
	int i,len;
	for(i=1; i<=Maxsize; i++)
		c.s[i]=0;
	len=a.len>=b.len ? a.len:b.len;
	for(i=1; i<=len; i++)
	{
		c.s[i]+=a.s[i]+b.s[i];
		if(c.s[i] >= 10)
		{
			c.s[i]-=10;
			c.s[i+1]+=1;
		}
	}
	if(c.s[len+1] >= 1)
		len=len+1;
	c.len=len;
}

void f_subtract(const bignum &a, const bignum &b, bignum &c)
{
	int i,len;
	for(i=1; i<=Maxsize; i++)
	{
		c.s[i]=0;
	}
	len=a.len>=b.len ? a.len:b.len;
	for(i=1; i<=len; i++)
	{
		c.s[i]+=a.s[i]-b.s[i];
		if(c.s[i] < 0)
		{
			c.s[i]+=10;
			c.s[i+1]-=1;
		}
	}
	while(len > 1 && c.s[len] == 0) len--;
	c.len=len;
}

void f_print(const bignum &c)
{
	int i;
	for(i=c.len; i>=1; i--)
	{
		printf("%d",c.s[i]);
	}
	printf("\n");
}

void f_multiply(const bignum &a, int n, bignum &c)
{
	int i,len;
	for(i=1; i<=Maxsize; i++)
		c.s[i]=0;
	len=a.len;
	for(i=1; i<=len; i++)
	{
		c.s[i]+=a.s[i]*n;
		c.s[i+1]=c.s[i]/10;
		c.s[i]%=10;
	}
	len++;
	while(c.s[len] >= 10)
	{
		c.s[len+1]=c.s[len]/10;
		c.s[len]%=10;
		len++;
	}
	while(len > 1 && c.s[len] == 0) len--;
	c.len=len;
}

void f_division(const bignum &a, int n, bignum &c, int &residue)
{
	int i,len;
	__int64 re;
	for(i=1; i<=Maxsize; i++)
		c.s[i]=0;
	len=a.len;
	re=0;
	for(i=len; i>=1; i--)
	{
		re=re*10+a.s[i]; // re may exceed long
		c.s[i]=(int)(re/n);
		re%=n;
	}
	residue=(int)re;
	while(len > 1 && c.s[len] == 0) len--;
	c.len=len;
}

int f_cmp(const bignum &a, const bignum &b)
{
	int len;
	len=a.len>=b.len ? a.len:b.len;
	while(len >= 1 && a.s[len]==b.s[len]) len--;
	if(len == 0)
		return (0);
	else
		return (a.s[len]-b.s[len]);
}

void f_hmultiply(const bignum &a, const bignum &b, bignum &c)
{
	int i,j,len;
	for(i=1; i<=Maxsize; i++)
		c.s[i]=0;
	for(i=1; i<=a.len; i++)
		for(j=1; j<=b.len; j++)
		{
			c.s[i+j-1]+=a.s[i]*b.s[j];
			c.s[i+j]+=c.s[i+j-1]/10;
			c.s[i+j-1]%=10;
		}
	len=a.len+b.len+1;
	while(len > 1 && c.s[len] == 0) len--;
	c.len=len;
}

void f_hdivision(const bignum &a, const bignum &b, bignum &c, bignum &d)
{
	int i,len;
	bignum e;
	for(i=1; i<=Maxsize; i++)
	{
		c.s[i]=0;
		d.s[i]=0;
	}
	d.len=1;
	len=a.len;
	for(i=len; i>=1; i--)
	{
		f_multiply10(d);
		d.s[1]=a.s[i];
		while(f_cmp(d,b) >= 0)
		{
			f_subtract(d,b,e);
			d=e;
			c.s[i]++;
		}
	}
	while(len > 1 && c.s[len] == 0) len--;
	c.len=len;
}

void f_multiply10(bignum &a)
{
	int i,len;
	len=a.len;
	for(i=len; i>=1; i--)
		a.s[i+1]=a.s[i];
	len++;
	while(len > 1 && a.s[len] == 0) len--;
	a.len=len;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -