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

📄 bignum.cpp

📁 大数运算的实现,包括加减乘除,四种运算,用个个函数实现各个功能,便于使用.
💻 CPP
字号:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <graphics.h>
#include <stdlib.h>
int BigNum1[200],BigNum2[200];
int result[300];
int midx,midy;

void windows();
void input(int *num);
void get(int *num1,int *target,int m,int n);
int compare(int *num1,int *num2);
void add(int *num1,int *num2,int *result);
void multiply(int *num1,int *num2,int *result);
void subtract(int *num1,int *num2,int *result);
void devide(int *num1,int *num2,int *result);
void output(int *num);

void main()
{
	int n=1;
	char ch;

	while(1)
	{
		windows();
		gotoxy(18,9);
		input(BigNum1);
		while(1)
		{
		       if(kbhit)
		       {
				ch=getch();
				if(ch==72)
					if(n-1<0)n=4;
						else n--;

				setfillstyle(1,BLUE);
				bar(midx-190,midy-80,midx+180,midy-64);
				switch(n)
				{
					 case 1:gotoxy(40,11);
						printf("#");
						break;
					 case 2:gotoxy(45,11);
						printf("#");
						break;
					 case 3:gotoxy(50,11);
						printf("#");
						break;
					 case 4:gotoxy(55,11);
					 printf("#");
				}
				if(ch==13)
				      break;
			}
		}
		gotoxy(18,13);
		input(BigNum2);
		memset(result,0,300*sizeof(int));
		switch(n)
		{
			case 1:add(BigNum1,BigNum2,result);break;
			case 2:subtract(BigNum1,BigNum2,result);break;
			case 3:multiply(BigNum1,BigNum2,result);break;
			case 4:devide(BigNum1,BigNum2,result);
		}
		output(result);
		ch=getch();
		if(ch=='Q'||ch=='q')break;
	}
}

void input(int *num)
{
	int i,j;
	char str[200];

	j=1;
	scanf("%s",str);
	i=strlen(str)-1;
	while(i>=0)
	{
		num[j]=str[i]-'0';
		i--;
		j++;
	}
	num[0]=j-1;
}

void windows()
{
	int GraphDriver,GraphMode;

	GraphDriver=DETECT;
	initgraph(&GraphDriver,&GraphMode,"bgi");
	midx = getmaxx() / 2;
	midy = getmaxy() / 2;
	setbkcolor(BLACK);
	setfillstyle(1, BLUE);
	bar(midx-200,midy-150,midx+200,midy+150);
	gotoxy(30,5);
	printf("Big Number Calculater");
	setfillstyle(1,BLACK);
	bar(midx-190,midy-95,midx+180,midy-112);
	bar(midx-190,midy-30,midx+180,midy-47);
	bar(midx-190,midy+33,midx+180,midy+50);
	gotoxy(18,8);
	printf("BigNum1:");
	gotoxy(18,10);
	printf("Press UP to choose.");
	gotoxy(40,10);
	printf("+");
	gotoxy(45,10);
	printf("-");
	gotoxy(50,10);
	printf("*");
	gotoxy(55,10);
	printf("/");
	gotoxy(18,12);
	printf("BigNum2:");
	gotoxy(18,14);
	printf("=");
	gotoxy(18,17);
	printf("Result:");
	gotoxy(18,20);
	printf("Press q/Q to quit");
}

void get(int *num1,int *num2,int m,int n) //from mth,number n;
{
	int i;

	for(i=num2[0];i>0;i--)
	{
		num2[i+n]=num2[i];
	}
	for(i=1;i<=n;i++)
	{
		num2[i]=num1[m-n+i];
	}
	num2[0]+=n;
}

int compare(int *num1,int *num2)
{
	int i,j;
	if(num1[0]>num2[0])return(1);
		else if(num1[0]<num2[0])return(-1);
	for(i=0;i<num2[0];i++)
	{
		if(num1[num1[0]-i]<num2[num2[0]-i])return(-1);
			else if(num1[num1[0]-i]>num2[num2[0]-i])return(1);
	}
	return(0);
}

void add(int *num1,int *num2,int *result)
{
	int extra[200],i=1,all;

	memset(extra,0,200*sizeof(int));
	result[0]=0;
	while(i<=num1[0]||i<=num2[0]||extra[i]!=0)
	{
		all=0;
		if(num1[i]!=0)all+=num1[i];
		if(num2[i]!=0)all+=num2[i];
		if(extra[i]!=0)all+=extra[i];
		if(all>=10)extra[i+1]=all/10;
		result[i]=all%10;
		result[0]++;
		i++;
	}
}

void multiply(int *num1,int *num2,int *result)
{
	int p1=1,p2=1,i,all,extra[200],plus[200];

	while(p2<=num2[0])
	{
		i=p2;
		if(num2[p2]!=0)
		{
			p1=1;
			memset(plus,0,sizeof(int)*200);
			memset(extra,0,sizeof(int)*200);
			while(p1<=num1[0])
			{
				all=0;
				if(num1[p1]!=0)all+=num1[p1];
				if(num2[p2]!=0)all*=num2[p2];
				if(extra[i]!=0)all+=extra[i];
				if(all>0)extra[i+1]=all/10;
				plus[i]=all%10;
				p1++;
				i++;
			}
			if(extra[i]!=0)plus[i]=extra[i];
				else i--;
			plus[0]=i;
			add(plus,result,result);
		}
		p2++;
	}
}

void subtract(int *num1,int *num2,int *result)
{
	int p1=1;
	int p2=1;
	int m,k=0;

	result[0]=0;
	while(num1[p1]||num2[p2])
	{
		m=num1[p1]-num2[p2];
		if(m<0)
		{
			m=m+10;
			num1[p1+1]--;
		}
		result[p1]=m;
		if(m==0)k++;
			else k=0;
		result[0]++;
		p1++;
		p2++;
	}
	while(num1[p1])
	{
		k=0;
		result[p1]=num1[p1];
		p1++;
		result[0]++;
	}
	result[0]-=k;
}

void devide(int *num1,int *num2,int *result)
{
	int p1,d[2],i,j,getnum[200],trial[200],oldgetnum=0,real=1;
	p1=num1[0];
	memset(getnum,0,sizeof(int)*200);
	while(p1-getnum[0]>0)
	{
		get(num1,getnum,p1-getnum[0],num2[0]-getnum[0]);
		j=0;
		while(compare(getnum,num2)<0)
		{
			get(num1,getnum,p1-num2[0]-j,1);
			j++;
		}
		if(real==1)
		{
			result[0]=p1-getnum[0]+1;
			real=0;
		}
		for(i=0;i<=8;i++)
		{
			d[0]=1;
			d[1]=i;
			memset(trial,0,sizeof(int)*200);
			multiply(num2,d,trial);
			if(compare(trial,getnum)<0)
			{
				d[0]=1;
				d[1]=i+1;
				memset(trial,0,sizeof(int)*200);
				multiply(num2,d,trial);
				if(compare(trial,getnum)>0)
				{
					d[1]=i;
					memset(trial,0,sizeof(int)*200);
					multiply(num2,d,trial);
					break;
				}
			}
			else break;
		}
		result[p1-getnum[0]+1]=i;
		oldgetnum=getnum[0];
		subtract(getnum,trial,getnum);
		p1=p1-(oldgetnum-getnum[0]);
		while(num1[p1-getnum[0]]==0&&p1>0&&getnum[0]==0)
		{
			p1--;
		}
	}
}

void output(int *num)
{
	int i=num[0];
	gotoxy(18,18);
	while(i>0)
	{
		printf("%d",num[i]);
		i--;
	}
}





⌨️ 快捷键说明

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