怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神
用c語(yǔ)言編寫(xiě)大整數(shù)的四則運(yùn)算,求大神
答案:3??信息版本:手機(jī)版
解決時(shí)間 2019-10-03 17:13
已解決
2019-10-03 01:32
用c語(yǔ)言編寫(xiě)大整數(shù)的四則運(yùn)算,求大神
最佳答案
2019-10-03 02:09
你可以找一下加密庫(kù)的源文件來(lái)研究下,里面就有大數(shù)四則運(yùn)算,曾經(jīng)試著寫(xiě)2048位的大數(shù)四則運(yùn)算,結(jié)果就寫(xiě)了加法,減法,和簡(jiǎn)單的沒(méi)有優(yōu)化的乘法就沒(méi)信心寫(xiě)了。。。大數(shù)是用數(shù)組表示的,沒(méi)有用結(jié)構(gòu)體,復(fù)制來(lái)的,不知能不能運(yùn)行。。
#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.大整數(shù)的加法??????????*
");
printf("*???????????2.大整數(shù)的減法??????????*
");
printf("*???????????3.大整數(shù)的乘法??????????*
");
printf("*???????????4.大整數(shù)進(jìn)制轉(zhuǎn)換 ? ?*
");
printf("*???????????5.幫助 ?*
");
printf("*???????????6.退出??????????????????*
");
printf("*???????????????????????????????????*
");
printf("**************************************
");
printf("
請(qǐng)選擇(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("請(qǐng)輸入待轉(zhuǎn)換的大整數(shù):");
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("十進(jìn)制:");
my_print(b);
printf("二進(jìn)制:");
my_print(c);
goto?loop;
}
printf("請(qǐng)輸入大整數(shù)A:");
my_read(a);
printf("請(qǐng)輸入大整數(shù)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("
繼續(xù)計(jì)算嗎?(y/n)");
yn=getch();
if?(yn=='y')?goto?strat;
if?(yn=='n')?return;
}
}
全部回答
1樓
2019-10-03 03:32
用結(jié)構(gòu)體來(lái)表示大數(shù),理論上是不限制的。
吧相應(yīng)的進(jìn)位做好就ok
2樓
2019-10-03 02:21
思路:
實(shí)現(xiàn)大數(shù)的比較
實(shí)現(xiàn)大數(shù)的加1操作
實(shí)現(xiàn)大數(shù)的減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
我要舉報(bào)
如果感覺(jué)以上信息為低俗/不良/侵權(quán)的信息,可以點(diǎn)下面鏈接進(jìn)行舉報(bào),我們會(huì)做出相應(yīng)處理,感謝你的支持!
大家都在看
推薦資訊
總結(jié)
以上是生活随笔為你收集整理的怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么求星期几的后几天C语言,计算任何一天
- 下一篇: android 实现显示电量,Andro