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

📄 zxl.cpp

📁 实现大数的加、减、乘、取模运算
💻 CPP
字号:
#include "stdio.h"
#include "string.h"
#include "memory.h"
#define MAXLEN 100//定义大数的位数

struct Bigint{
	int len;
	int digits[MAXLEN];
};//定义大数结构体

//////////////////			
void cheng(char str1[],char str2[])//大数乘法函数
{
	Bigint num1,num2,num3;
	int i,j;
	num1.len=strlen(str1);
	memset(num1.digits,0,sizeof(num1.digits));
	for(i=0;i<num1.len;i++)
		num1.digits[i]=str1[num1.len-1-i]-'0';
	num2.len=strlen(str2);
	memset(num2.digits,0,sizeof(num2.digits));
	for(i=0;i<num2.len;i++)
		num2.digits[i]=str2[num2.len-1-i]-'0';
	num3.len=num1.len+num2.len;
	memset(num3.digits,0,sizeof(num3.digits));
	for(i=0;i<num1.len;i++)
		for(j=0;j<num2.len;j++)
			num3.digits[i+j]=num1.digits[i]*num2.digits[j];
		for(i=0;i<num3.len;i++)
			if(num3.digits[i]>9)
			{
				num3.digits[i+1]+=num3.digits[i]/10;
				num3.digits[i]%=10;
				while(num3.digits[num3.len])
					num3.len++;
			}
			for(i=num3.len-1;i>=0;i--)
				printf("%d",num3.digits[i]);
			putchar('\n');
}
//////////////////
void jia(char str1[],char str2[])//大数加法函数
{
	Bigint num1,num2,num3;
	int i;
	int maxlen;
	num1.len=strlen(str1);
	memset(num1.digits,0,sizeof(num1.digits));
	for(i=0;i<num1.len;i++)
		num1.digits[i]=str1[num1.len-1-i]-'0';
	num2.len=strlen(str2);
	memset(num2.digits,0,sizeof(num2.digits));
	for(i=0;i<num2.len;i++)
		num2.digits[i]=str2[num2.len-1-i]-'0';
	if(num1.len>num2.len)
	{
		maxlen=num1.len;
	    num3.len=num1.len;
	}
	else
	{
		num3.len=num2.len;
		maxlen=num2.len;
	}
	for(i=0;i<num3.len;i++)
		num3.digits[i]=num1.digits[i]+num2.digits[i];
	for(i=0;i<num3.len-1;i++)
			if(num3.digits[i]>9)
			{
				num3.digits[i]=num3.digits[i]-10;
				num3.digits[i+1]=num3.digits[i+1]+1;
			}
			for(i=num3.len-1;i>=0;i--)
				printf("%d",num3.digits[i]);
			putchar('\n');
}
//////////////////
void jian(char str1[],char str2[])//大数减法运算
{
	Bigint num1,num2,num3;
	int i;
	int maxlen;
	num1.len=strlen(str1);
	memset(num1.digits,0,sizeof(num1.digits));
	for(i=0;i<num1.len;i++)
		num1.digits[i]=str1[num1.len-1-i]-'0';
	num2.len=strlen(str2);
	memset(num2.digits,0,sizeof(num2.digits));
	for(i=0;i<num2.len;i++)
		num2.digits[i]=str2[num2.len-1-i]-'0';
	if(num1.len>num2.len)
	{
		maxlen=num1.len;
	    num3.len=num1.len;
	}
	else
	{
		num3.len=num2.len;
		maxlen=num2.len;
	}
	for(i=0;i<num3.len;i++)
	{
		if(num1.digits[i]<num2.digits[i])
		{
			num1.digits[i]=num1.digits[i]+10;
			num1.digits[i+1]=num1.digits[i+1]-1;
		}
		num3.digits[i]=num1.digits[i]-num2.digits[i];
	}
	for(i=0;i<num3.len-1;i++)
			if(num3.digits[i]>9)
			{
				num3.digits[i]=num3.digits[i]-10;
				num3.digits[i+1]=num3.digits[i+1]+1;
			}
			for(i=num3.len-1;i>=0;i--)
				printf("%d",num3.digits[i]);
			putchar('\n');
}
//////////////////
int cmp(int a[MAXLEN],int b[MAXLEN])//比较数的大小
{
	int i,result;
	result=0;
	for(i=MAXLEN-1;i>=0;i--)
	{
		if(a[i]!=0&&b[i]==0)
			return 1;
	}
	for(i=MAXLEN;i>=0;i--)
	{
		if(a[i]>b[i])
			return 1;
		if(a[i]<b[i])
			return -1;
		
	}
	return 0;
}
//////////////////
int * jian1(char str1[],char str2[])//大数减法运算(用于除法中的减法)
{
	Bigint num1,num2,num3;
	int i;
	int *INT=NULL;
	int maxlen;
	int LEN;
	memset(num3.digits,0,sizeof(num3.digits));
	num1.len=strlen(str1);
	memset(num1.digits,0,sizeof(num1.digits));
	for(i=0;i<num1.len;i++)
		num1.digits[i]=str1[num1.len-1-i]-'0';

	num2.len=strlen(str2);
	memset(num2.digits,0,sizeof(num2.digits));
	for(i=0;i<num2.len;i++)
		num2.digits[i]=str2[num2.len-1-i]-'0';

	if(num1.len>num2.len)
	{
		maxlen=num1.len;
	    num3.len=num1.len;
		LEN=num3.len;
	}
	else
	{
		num3.len=num2.len;
		maxlen=num2.len;
		LEN=num3.len;
	}
	for(i=0;i<num3.len;i++)
	{
		if(num1.digits[i]<num2.digits[i])
		{
			num1.digits[i]=num1.digits[i]+10;
			num1.digits[i+1]=num1.digits[i+1]-1;
		}
		num3.digits[i]=num1.digits[i]-num2.digits[i];
	}
    num3.digits[i]=LEN;
	INT=num3.digits;
	return INT;
}
//////////////////
void division(char str1[],char str2[])//除法运算
{
	Bigint num1,num2,num3;
	int i,shang=0;
	int *ljian=NULL;
	int lenlen;
	int len1,len2;
	len1=strlen(str1);
	len2=strlen(str2);
	if(len1>len2)
		lenlen=len1;
	else
		lenlen=len2;

	ljian=jian1(str1,str2);
	lenlen=*(ljian+lenlen);
	*(ljian+len2)=0;
	ljian=NULL;
	memset(num3.digits,0,sizeof(num3.digits));

	num1.len=strlen(str1);
	memset(num1.digits,0,sizeof(num1.digits));
	for(i=0;i<lenlen;i++)
		num1.digits[i]=str1[lenlen-1-i]-'0';
	
    num2.len=strlen(str2);
	memset(num2.digits,0,sizeof(num2.digits));
	for(i=0;i<num2.len;i++)
		num2.digits[i]=str2[num2.len-1-i]-'0';
	ljian=jian1(str1,str2);
	shang=shang+1;
	while(1)
	{
		for(i=0;i<lenlen;i++)
			num3.digits[i]=*(ljian+i);
		memset(str1,0,MAXLEN);
		for(i=0;i<lenlen;i++)
			str1[i]=num3.digits[lenlen-1-i]+48;
		str1[i]='\0';
		if(cmp(num3.digits,num2.digits)==1||cmp(num3.digits,num2.digits)==0)
			shang=shang+1;
		else
			if(cmp(num3.digits,num2.digits)==-1)
				break;
		ljian=jian1(str1,str2);
	}	
	printf("商  是:%d\n",shang);
	printf("余数是:");
	for(i=lenlen-1;i>=0;i--)
		printf("%d",num3.digits[i]);
	printf("\n");
}
//////////////////
int main()//main函数
{
	char str1[MAXLEN];
	char str2[MAXLEN];
	int len1,len2;
	int i;
    printf("请输入两个大数进行乘法运算:\n");
	scanf("%s",str1);
	scanf("%s",str2);
	printf("乘法运算结果为:");
	cheng(str1,str2);//乘法
	printf("\n");
	memset(str1,0,strlen(str1));
	memset(str2,0,strlen(str2));
	printf("请输入两个大数进行加法运算:\n");
	scanf("%s",str1);
	scanf("%s",str2);
	printf("加法运算结果为:");
	jia(str1,str2);//加法
	printf("\n");
	memset(str1,0,MAXLEN);
	memset(str2,0,MAXLEN);
    printf("请输入两个大数进行减法运算:\n");
	scanf("%s",str1);
	scanf("%s",str2);
    len1=strlen(str1);
	len2=strlen(str2);
	printf("减法运算结果为:\n");
	if(len1>len2)
		jian(str1,str2);
	if(len1<len2)
	{
		printf("-");
		jian(str2,str1);
	}
	if(len1==len2)
		if (str1[0]>=str2[0])
			jian(str1,str2);
		else
		{
			printf("-");
			jian(str2,str1);
		}
		printf("\n");
	len1=0;
	len2=0;
	printf("请输入两个大数进行除法运算:\n");
	scanf("%s",str1);
	scanf("%s",str2);
    len1=strlen(str1);
	len2=strlen(str2);
	printf("除法运算结果为:\n");
	if(len1>len2)
		division(str1,str2);
	if(len1<len2)
	{
		printf("商  是:00\n");
		printf("余数是:");
		for(i=0;i<len2;i++)
			printf("%c",str2[i]);
	}
	if(len1==len2)
		if (str1[0]>=str2[0])
			division(str1,str2);
		else
		{
			printf("商  是:00\n");
			printf("余数是:");
			for(i=0;i<len2;i++)
				printf("%c",str2[i]);
		}
		return 0;
}

⌨️ 快捷键说明

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