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