怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神

用c语言编写大整数的四则运算,求大神

答案:3  信息版本:手机版

解决时间 2019-10-03 17:13

已解决

2019-10-03 01:32

用c语言编写大整数的四则运算,求大神

最佳答案

2019-10-03 02:09

你可以找一下加密库的源文件来研究下,里面就有大数四则运算,曾经试着写2048位的大数四则运算,结果就写了加法,减法,和简单的没有优化的乘法就没信心写了。。。大数是用数组表示的,没有用结构体,复制来的,不知能不能运行。。

#define MAX 400

void my_read(int *a)

{

int len,i,flag=0;

char s[MAX];

aa:

while(1)

{

scanf("%s",&s);

len=strlen(s);

if (s[0]=='-') flag=1;

for(i=len-flag;i>=1;i--)

{

if ((s[len-i]-'0')<0||(s[len-i]-'0')>9)

{

printf("你输入的第%d位不合法,按任意键重新输!!",len-i+1);

getch();

goto aa;

}

else

a[i]=s[len-i]-'0';

}

if (flag)

a[0]=-(len-1);

else

a[0]=len;

break;

}

return;

}

void my_print(int *a)

{

int i;

if (a[0]<0) printf("-");

if (a[0]==0)

{

printf("0");

return;

}

for(i=abs(a[0]);i>=1;i--)

printf("%d",a[i]);

printf("

");

}

void format(int *a)

{

int p;

for(p=1;p=10;p++)

{

if (p>=a[0]) a[p+1]=0;

a[p+1]+=a[p]/10;

a[p]=a[p]%10;

}

if (p>=a[0]) a[0]=p;

return;

}

void add(int *a,int *b,int *c)

{

int len,i;

if (a[0]   else len=b[0];

for(i=1;i<=len;i++)

c[i]=a[i]+b[i];

if (len{

for (;i<=a[0];i++)

c[i]=a[i];

c[0]=a[0];

}

else

{

for(;i<=b[0];i++)

{

c[i]=b[i];

}

c[0]=b[0];

}

format (c);

}

void commaltiply (int *a,int x,int *b)

{

int i;

for(i=1;i<=a[0];i++)

b[i]=a[i]*x;

b[0]=a[0];

format(b);

return;

}

void matiply(int *a,int *b,int *c)

{

int i,temp[MAX],j;

commaltiply(a,b[1],c);

for(i=2;i<=b[0];i++)

{

if (b[i]==0)

{

c[0]++;

for (j=c[0];j>1;j--)

c[1]=0;

}

else

{

commaltiply(a,b[i],temp);

for(j=1;j     commaltiply(temp,10,temp);

add(c,temp,c);

}

}

}

void dectobin(int *a,int *b)

{

int p;

b[0]=0;

while(a[0]>0)

{

b[0]++;

b[b[0]]=a[1]%2;

p=a[0];

while(p>0)

{

if (a[p]%2 && p>1) a[p-1]+=10;

a[p]/=2;

if (a[a[0]]==0) a[0]--;

p--;

}

}

}

format1(int *a)

{

int i;

for (i=1;i<=a[0];i++)

if (a[i]<0)

{ a[i]+=10;

a[i+1]-=1;

}

}

void sub_1(int *a,int *b,int *c)

{

int i;

for (i=1;i<=b[0];i++)

c[i]=a[i]-b[i];

if (a[0]==b[0]) goto loop;

for (;i<=a[0];i++)

c[i]=a[i];

loop:

c[0]=a[0];

format1(c);

i=c[0];

while(1)

if (c[i]==0) i--;

else break;

c[0]=i;

return;

}

void sub(int *a,int *b,int *c)

{

int i,flag=0;

for (i=1;i<=a[0];i++)

if (a[i]!=b[i]) {flag=1;break;}

if (flag==0)

{

c[0]=0;

return;

}

flag=0;

if (a[0]==b[0])

{

i=a[0];

while(i>0)

{

if (a[i]>b[i])

{

sub_1(a,b,c);

break;

}

if (a[i]{

flag=1;

sub_1(b,a,c);

break;

}

i--;

}

}

if (a[0]>b[0])

sub_1(a,b,c);

else

if (a[0]     {

flag=1;

sub_1(b,a,c);

}

if (flag)

c[0]=-c[0];

else

c[0]=c[0];

}

void main()

{

int i,a[MAX],b[MAX],c[MAX];

char yn;

strat:

while(1)

{

clrscr();

printf("

");

printf("**************************************

");

printf("*        *

");

printf("*           1.大整数的加法          *

");

printf("*           2.大整数的减法          *

");

printf("*           3.大整数的乘法          *

");

printf("*           4.大整数进制转换     *

");

printf("*           5.帮助        ?*

");

printf("*           6.退出                  *

");

printf("*                                   *

");

printf("**************************************

");

printf("

请选择(1-6):");

yn=getch();

if (yn=='1'||yn=='2'||yn=='3'||yn=='4'||yn=='5'||yn=='6') break;

else

{

printf("

输入不合法!按任意键重新输入!!!!");     getch();

}

}

clrscr();

if (yn=='6') return;

if (yn=='4')

{

printf("请输入待转换的大整数:");

printf("

");

my_read(a);

for (i=1;i<=abs(a[0]);i++)

b[i]=a[i];

b[0]=a[0];

if (a[0]<0) {a[0]=-a[0];dectobin(a,c);a[0]=-a[0];c[0]=-c[0];goto e;}

dectobin(a,c);

e:

printf("十进制:");

my_print(b);

printf("二进制:");

my_print(c);

goto loop;

}

printf("请输入大整数A:");

my_read(a);

printf("请输入大整数B:");

my_read(b);

if (yn=='1')

{

if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];add(a,b,c);c[0]=-c[0];a[0]=-a[0];b[0]=-b[0];goto c;}

if (a[0]>0 && b[0]<0) {b[0]=-b[0];sub(a,b,c);b[0]=-b[0];goto c;}

if (a[0]>0 && b[0]>0) {add(a,b,c);goto c;}

if (a[0]<0 && b[0]>0) {a[0]=-a[0];sub(b,a,c);a[0]=-a[0];goto c;}

c:

printf("

");

printf("A=");

my_print(a);

printf("

");

printf("B=");

my_print(b);

printf("

");

printf("C=A+B=");

my_print(c);

goto loop;

}

if (yn=='2')

{

if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];sub(b,a,c);a[0]=-a[0];b[0]=-b[0];}

if (a[0]<0 && b[0]>0) {a[0]=-a[0];add(a,b,c);a[0]=-a[0];c[0]=-c[0];}

if (a[0]>0 && b[0]<0) {b[0]=-b[0];add(a,b,c);b[0]=-b[0];}

if (a[0]>0 && b[0]>0) sub(a,b,c);

printf("A=");

my_print(a);

printf("

B=");

my_print(b);

printf("

C=A-B=");

my_print(c);

goto loop;

}

if (yn=='3')

{

if (a[0]<0 && b[0]>0) {a[0]=-a[0];matiply(a,b,c);a[0]=-a[0];c[0]=-c[0];goto d;}

if (a[0]>0 && b[0]<0) {b[0]=-b[0];matiply(a,b,c);b[0]=-b[0];c[0]=-c[0];goto d;}

if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];matiply(a,b,c);a[0]=-a[0];b[0]=-b[0];goto d;}

matiply(a,b,c);

d:

printf("

A=");

my_print(a);

printf("

B=");

my_print(b);

printf("

C=A*B=");

my_print(c);

goto loop;

}

loop:

while(1)

{

printf("

继续计算吗?(y/n)");

yn=getch();

if (yn=='y') goto strat;

if (yn=='n') return;

}

}

全部回答

1楼

2019-10-03 03:32

用结构体来表示大数,理论上是不限制的。

吧相应的进位做好就ok

2楼

2019-10-03 02:21

思路:

实现大数的比较

实现大数的加1操作

实现大数的减1操作

加法:A+B=(A+1) + (B-1),按照此原则递归直到B-1为0

减法:A-B=(A-1) - (B-1),按照此原则递归直到B-1为0

乘法:A*B=A+A*(B-1),按照此原则递归直到B-1为0

除法:A/B=1 + (A-B)/B,按照此原则递归直到 (A-B) < B

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值