求C语言写的高精度除法代码!!!!!! C语言,请问高精度除法的实现方法是什么?原理不要代码!当除数...

作者&投稿:韶泰 (若有异议请与网页底部的电邮联系)
这个不是C语言。是pas语言。。。。不过看看把,差不多。
其实这个算法不难,就是数组模拟除法操作,稍微想象很容易的。Acm比赛中的基本算法。
我没有写这个程序,从信息初学者那里找了两个算法,pascal写的,根据你用的语言自己转化下吧,以前用c++写的找不到了:(

除法 1 : 高精度数 / 单精度数

{
Author : tenshi
Date : 2002-03-10
Problem : High Precision --- Divide
Algorithm : simple
Input : two lines,
1st line : a positive HighPrecision Number
2nd line : a positive Low Precicion Number
Output : times & rest of the two Numbers
}
program HighPrecision3_Multiply1;
const
fn_inp='hp5.inp';
fn_out='hp5.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x,y:hp;
z,w:integer;

procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s[i]);
end;

procedure init;
var
st:string;
i:integer;
begin
assign(input,fn_inp);
reset(input);
readln(st);
x.len:=length(st);
for i:=1 to x.len do { change string to HP }
x.s[i]:=ord(st[x.len+1-i])-ord('0');
readln(z);
close(input);
end;

procedure Divide(a:hp;b:integer;var c:hp;var d:integer);
{ c:=a div b ; d:=a mod b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
d:=0;
for i:=len downto 1 do { from high to low }
begin
d:=d*10+a.s[i];
c.s[i]:=d div b;
d:=d mod b;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;

procedure main;
begin
Divide(x,z,y,w);
end;

procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
writeln(w);
close(output);
end;

begin
init;
main;
out;
end.

除法 2 : 高精度数 / 高精度数

{
Author : tenshi
Date : 2002-03-10
Problem : High Precision --- Divide
Algorithm : simple
Input : two lines, each line a positive HighPrecision Number
Output : quotient & modulus of the two HighPrecision Numbers
}
program HighPrecision4_Multiply2;
const
fn_inp='hp6.inp';
fn_out='hp6.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x:array[1..2] of hp;
y,w:hp; { x:input ; y:output }

procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s[i]);
end;

procedure init;
var
st:string;
j,i:integer;
begin
assign(input,fn_inp);
reset(input);
for j:=1 to 2 do
begin
readln(st);
x[j].len:=length(st);
for i:=1 to x[j].len do { change string to HP }
x[j].s[i]:=ord(st[x[j].len+1-i])-ord('0');
end;
close(input);
end;

procedure Subtract(a,b:hp;var c:hp); { c:=a-b, suppose a>=b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
for i:=1 to len do { subtract from low to high }
begin
inc(c.s[i],a.s[i]-b.s[i]);
if c.s[i]<0 then
begin
inc(c.s[i],10);
dec(c.s[i+1]); { add 1 to a higher position }
end;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;

function Compare(const a,b:hp):integer;
{
1 if a>b
0 if a=b
-1 if a<b
}
var len:integer;
begin
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
while(len>0) and (a.s[len]=b.s[len]) do dec(len);
{ find a position which have a different digit }
if len=0 then compare:=0 { no difference }
else compare:=a.s[len]-b.s[len];
end;

procedure Multiply10(var a:hp); { a:=a*10 }
var i:Integer;
begin
for i:=a.len downto 1 do
a.s[i+1]:=a.s[i];
a.s[1]:=0;
inc(a.len);
while(a.len>1) and (a.s[a.len]=0) do dec(a.len);
end;

procedure Divide(a,b:hp;var c,d:hp); { c:=a div b ; d:=a mod b }
var i,j,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
fillchar(d,sizeof(d),0);
d.len:=1;
for i:=len downto 1 do
begin
Multiply10(d);
d.s[1]:=a.s[i]; { d:=d*10+a.s[i] }
{ c.s[i]:=d div b ; d:=d mod b; }
{ while(d>=b) do begin d:=d-b;inc(c.s[i]) end }
while(compare(d,b)>=0) do
begin
Subtract(d,b,d);
inc(c.s[i]);
end;
end;
while(len>1)and(c.s[len]=0) do dec(len);
c.len:=len;
end;

procedure main;
begin
Divide(x[1],x[2],y,w);
end;

procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
PrintHP(w);
writeln;
close(output);
end;

begin
init;
main;
out;
end.

高精度的 除法运算只是把 算出来的值 的精确位数提高把 你把它的,类型设为高精度啊 比如long double型 可以算到 小数点后 18-19 位

楼主我有个更好的地方,说给你去看看,人家把PI算到了1000位小数啊.
而且别人只用了30条语句.

http://www.cppfans.com/articles/basecalc/c_pi_10000.asp

能把分给我不?

以前好像做过,准备acm用的,大整数四则运算

我去找找

求C语言高精度除法中大数除以大数的代码,尽量精简,能看懂就行~

#include
#include
#define MAX_LEN 200
char a[MAX_LEN + 10];
char b[MAX_LEN + 10];
int va[MAX_LEN + 10]; //被除数, an1[0]对应于个位
int vb[MAX_LEN + 10]; //除数, an2[0]对应于个位
int vc[MAX_LEN + 10]; //存放商,aResult[0]对应于个位
//长度为 nLen1 的大整数p1 减去长度为nLen2 的大整数p2
//结果放在p1 里,返回值代表结果的长度
//如不够减返回-1,正好减完返回 0
//下面判断p1 是否比p2 大,如果不是,返回-1
int Substract( int * p1, int * p2, int nLen1, int nLen2)
{
int i;
if( nLen1 < nLen2 )
return -1;
if( nLen1 == nLen2 )
{
for( i = nLen1-1; i >= 0; i -- )
{
if( p1[i] > p2[i] ) break; //p1>p2
else if( p1[i] < p2[i] ) return -1; //p1<p2
}
}
for( i = 0; i < nLen1; i ++ )
{ //要求调用本函数确保当i>=nLen2 时,p2[i] = 0
p1[i] -= p2[i];
if( p1[i] < 0 )
{
p1[i]+=10;
p1[i+1] --;
}
}
for( i = nLen1 -1 ; i >= 0 ; i-- )
if( p1[i] )//找到最高位第一个不为0
return i + 1;
return 0;//全部为0,说明两者相等
}
int main()
{
freopen("test.txt","r",stdin);
int test;
scanf("%d",&test);
while(test--){
scanf("%s", a);
scanf("%s", b);
int i, j;
int lena = strlen(a);
memset( va, 0, sizeof(va));
memset( vb, 0, sizeof(vb));
memset(vc, 0, sizeof(vc));
for( j = 0, i = lena - 1;i >= 0 ; i --)
va[j++] = a[i] - '0';
int lenb = strlen(b);
for( j = 0, i = lenb - 1;i >= 0 ; i --)
vb[j++] = b[i] - '0';
if( lena < lenb )
{
printf("0
");
continue;
}
int nTimes = lena - lenb;
if(nTimes > 0)
{
for( i = lena -1; i >= nTimes; i -- )
vb[i] = vb[i-nTimes];//朝高位移动
for( ; i >= 0; i--)//低位补0
vb[i] = 0;
lenb = lena;
}
for( j = 0 ; j <= nTimes; j ++ )
{
int nTmp;
//一直减到不够减为止
//先减去若干个 an2×(10 的 nTimes 次方),
//不够减了,再减去若干个 an2×(10 的 nTimes-1 次方),......
while( (nTmp = Substract(va, vb+j, lena, lenb-j)) >= 0)
{
lena = nTmp;
vc[nTimes-j]++; //每成功减一次,则将商的相应位加1
}
}
//下面输出结果,先跳过高位0
for( i = MAX_LEN ; (i >= 0) && (vc[i] == 0); i -- );
if( i >= 0)
for( ; i>=0; i--)
printf("%d", vc[i]);
else
printf("0");
printf("
");
}
return 0;
}

最好的方法是模拟手算的除法过程,使用数组存储除数和被除数

...1-100 之间的整数,并且被除数能为除数整除)?
答:代码文本:include "stdio.h"include <stdlib.h> include "time.h"int prime(int n){//素数 int i;if(n>2 && !(n&1) || n<2)return 0;for(i=3;i*i<=n;i+=2)if(!(n%i))return 0;return 1;} int main(int argc,char *argv[]){ int n,m,i,w,s;srand((unsigned)time...

怎样用c语言实现大整数运算除法?无错完整版,谢谢
答:include<stdlib.h> typedef struct veryLong { int d;struct veryLong *next;} longNumber;void Display(longNumber *h);void CharToInt(char *sn,longNumber **h);void Add(longNumber *h1, longNumber *h2, longNumber **h3);void main(){ char sn[1000];longNumber *h1=NULL,*h2=NULL...

C语言中怎么表示除法
答:1、首先,单击桌面上的VC6.0快捷方式,如图所示。2、然后点击下图所示的按钮,并且填写“名称”。3、名称可以自己起比如起名:yh1,执行完步骤3的页面显示如下图。4、单击如图所示位置,进入编译环境。5、点击左上角的“文件”,点击“新建”,点击下图所示的地方。6、删除里面文字,直到与下图一致。7...

c语言中的除法怎么算?
答:1 C语言中的除用符号 / (正斜杠)表示 2 用法 (1)当被除数和除数均为整型时,结果为整型 如1/2的结果是0,9/2的结果是4 (2)当被除数和除数任意一个为浮点数时,结果为浮点数 如1.0/2的结果是0.50000000000000000(double型),9.0/2.0的结果是4.5000000000000000(double型);1.0F/2的...

c语言除法取整怎么算?
答:1、简介 C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。2、特点 C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,...

C语言ascii码如何做除法运算啊 求指导!
答:/*C支持混合(不同类型的运算数)运算,有些规则。表达式(a/3),首先a会自动的(隐式的)转换成 和常量3相同的类型:int,然后再进行运算,最后运算结果是int类型。*/ float result = a / 3;//%f指示输出result十进制小数形式,默认精度(小数位数)为6。printf("%f",result);getchar();} ...

求写C语言计算器代码,要求加减乘除,求余数,阶乘,累加,排列,组合_百度知...
答:printf("* ④除法运算 * \n");printf("* ⑤取余运算 * \n");printf("* ⑥累加运算 * \n");printf("* ⑦阶乘运算 * \n");printf("* ⊙结束运算 * \n");printf("*** \n");printf("***

求加减乘除c语言代码
答:加减乘除还有什么代码啊。直接 变量名+运算符+变量名就可以了啊。注意除法 /是整除符号,如果符号两边都是整数(int型),那么结果值保留整数,小数将被忽略。 如果要精确到小数,'/'两边至少有一个是浮点数(float或double)。注意混合运算结果是按照表达式中数据表达范围最大的数据类型,例如:整数和...

c语言如何四舍五入 跟 进一法除法 的 算法
答:include<stdio.h> int main(){int a,b;scanf("%d%d",&a,&b);printf("%d/%d(四舍五入)=%d\n",a,b,(int)((float)a/b+0.5));printf("%d/%d(进一法)=%d\n",a,b,(int)(float)(a+b-1)/b);return 0;}

如何用C语言实现两个数的除法运算,这两个数可能非常大,也可能是小数...
答:1、在c语言中附法是整除运算,比如a/b,表示a中有几个b。2、示例:3/2=1 //这是取整运算,即3中有1个2。3、要保留小数,需要将结果表示成浮点数类型。示例:(3*1.0)/2=1.5 或者 double result = 3 / 2 ;