📄 zxl.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 + -