求助:C语言大整数相除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助:C语言大整数相除相关的知识,希望对你有一定的参考价值。

在编一个程序,需要得到两个大整数数相除后的精确结果,我用double型发现结果很不精确
麻烦大家指导一下
输入a和b,a,b均小于10000位
要求输出是a除b的商和余数

回beearko:你的程序有错误,取余运算只支持整数

回踏破铁网无觅处 :是啊,就是要高精度除法,我想了很久也想不出怎么写,只写出了一个大整数除一个小整数的高精度除法

回dciswo:double float型是什么,编译不过啊

回dielsalder :两个链接,一个没有除法运算,另一个结果
错误-_-!

回chenhaooo: 讨论大都没有结果 -_-!

回home2001me: 正因为如此本题才值100分^_^

回logo0775: 刚运行你的程序,还没仔细看,但结果不对-_-!,不过谢谢你那个BASE参数的设定,给我启发,让我写的大整数相乘程序能扩展到其它进制-------------------我刚看了你的程序,看不懂啊,能跟我解释一下吗?

其中被除数以c[]表示,除数以a[]表示,b[]表示商,BASE = 10表示10进制,LENGTH = 500表示位数。你还需要稍微改一下,仅供参考

#include <stdio.h>

const int LENGTH = 500;
const int BASE = 10;

int main()

int a[LENGTH] = 1,2,3,4,5,6,7,8,9;
int c[LENGTH] = 9,8,7,6,5,4,3,2,1;
int b[LENGTH] ;
for(int j = 0;j < LENGTH;j++)b[j] = 0;
int temp;
b[0] = c[0] / a[0];
for(int k = 0;k < LENGTH;k++)

temp = c[k];
for(int i = 0;i < k;i++)
temp -= a[k - i] * b[i];

b[k] = temp / a[0];

int s = 0;

for(k = LENGTH - 1;k >0;k--)

s = b[k];
b[k] %= BASE;
b[k - 1] += s / BASE;


for(k = LENGTH - 1;k >0;k--)

if(b[k] < 0)

s = b[k];
b[k] = (BASE + b[k] % BASE);
b[k - 1] += s / BASE - 1 ;

else

s = b[k];
b[k] %= BASE;
b[k - 1] += s / BASE;



printf("\n");
for(k = 0;k < LENGTH;k++)printf("%d",b[k]);

return 0;
参考技术A 我现在给你写一下,是long double不是double float 参考技术B 如果是1000位的话只能自己写处理函数了,或者用汇编写.没有什么高精度的数据类型可以使用.
我写一个把.100分好象不行吧,给我加到了200分吧!!!
参考技术C 用数组表示被除数和除数,用一个连表表示结果 参考技术D 对于大整数的除法只能用数组来解决这个问题,不管哪种类型,有效数字位数太少了.

提示一下:联想多项式的除法,希望你有点头绪了,只要是很大的数,一律只能用数组来处理,或者用链表来处理
第5个回答  2019-06-26 其中被除数以c[]表示,除数以a[]表示,b[]表示商,BASE
=
10表示10进制,LENGTH
=
500表示位数。你还需要稍微改一下,仅供参考
#include
<stdio.h>
const
int
LENGTH
=
500;
const
int
BASE
=
10;
int
main()

int
a[LENGTH]
=
1,2,3,4,5,6,7,8,9;
int
c[LENGTH]
=
9,8,7,6,5,4,3,2,1;
int
b[LENGTH]
;
for(int
j
=
0;j
<
LENGTH;j++)b[j]
=
0;
int
temp;
b[0]
=
c[0]
/
a[0];
for(int
k
=
0;k
<
LENGTH;k++)

temp
=
c[k];
for(int
i
=
0;i
<
k;i++)
temp
-=
a[k
-
i]
*
b[i];
b[k]
=
temp
/
a[0];

int
s
=
0;
for(k
=
LENGTH
-
1;k
>0;k--)

s
=
b[k];
b[k]
%=
BASE;
b[k
-
1]
+=
s
/
BASE;

for(k
=
LENGTH
-
1;k
>0;k--)

if(b[k]
<
0)

s
=
b[k];
b[k]
=
(BASE
+
b[k]
%
BASE);
b[k
-
1]
+=
s
/
BASE
-
1
;

else

s
=
b[k];
b[k]
%=
BASE;
b[k
-
1]
+=
s
/
BASE;


printf("\n");
for(k
=
0;k
<
LENGTH;k++)printf("%d",b[k]);
return
0;

c语言辗转相除法求最大公约数和最小公倍数

参考技术A

c语言辗转相除法求最大公约数和最小公倍数的方法如下:

一、算法思想

利用格式输入语句将输入的两个数分别赋给a和b,然后判断a和b的关系,如果a小于b,则利用中间变量t将其互换。再利用辗转相除法求出最大公约数,进而求出最小公倍数。最后用格式输出语句将其输出。

二、名词解释

1、最小公倍数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数时,通常会借助最大公约数来辅助计算。

2、最大公约数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。

3、辗转相除法: 是求最大公约数的一种方法。即用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

以上是关于求助:C语言大整数相除的主要内容,如果未能解决你的问题,请参考以下文章

java中整数过大怎么办

c 语言中除号仅用于整数间吗?

C++的大数除法最快速度的算法

java 两个整数相除 结果为一位小数

为啥c++cout语句整数相除保留了五位小数?

辗转相除法求最大公约数c语言代码