當前位置:首頁 » 編程語言 » c語言高精度除法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言高精度除法

發布時間: 2023-01-18 23:33:36

① 怎麼用c語言代碼實現超高精度的大數據除法運算要求結果保留到小數點後有兩位

#include<stdio.h>
#include<string.h>
#defineMAX_LEN200
chara[MAX_LEN+10];
charb[MAX_LEN+10];
intva[MAX_LEN+10];//被除數,an1[0]對應於個位
intvb[MAX_LEN+10];//除數,an2[0]對應於個位
intvc[MAX_LEN+10];//存放商,aResult[0]對應於個位
//長度為nLen1的大整數p1減去長度為nLen2的大整數p2
//結果放在p1里,返回值代表結果的長度
//如不夠減返回-1,正好減完返回0
//下面判斷p1是否比p2大,如果不是,返回-1
intSubstract(int*p1,int*p2,intnLen1,intnLen2)
{
inti;
if(nLen1<nLen2)
return-1;
if(nLen1==nLen2)
{
for(i=nLen1-1;i>=0;i--)
{
if(p1[i]>p2[i])break;//p1>p2
elseif(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
returni+1;
return0;//全部為0,說明兩者相等
}
intmain()
{
freopen("test.txt","r",stdin);
inttest;
scanf("%d",&test);
while(test--){
scanf("%s",a);
scanf("%s",b);
inti,j;
intlena=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';
intlenb=strlen(b);
for(j=0,i=lenb-1;i>=0;i--)
vb[j++]=b[i]-'0';
if(lena<lenb)
{
printf("0 ");
continue;
}
intnTimes=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++)
{
intnTmp;
//一直減到不夠減為止
//先減去若干個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(" ");
}
return0;
}

② C語言高精度除法,請問哪裡有錯誤啊

#include<stdio.h>
#include<string.h>
int main()
{
int a[1000],b[1000]; //定義兩個數組
int i,j,k,t;
for (i=0;i<1000;i++)
{ //a[0]=20 a[1]=10 a[2]=20 a[3]=30 a[4]=40
scanf ("%d",&a[i]); //假如輸入5個數
if (a[i]==' ') //如果沒有輸入就退出
break;
} //循環輸入數組數據
scanf ("%d",&j); //輸入j數據 假如 輸入 j=1 j=20
k=i-1; //如果 i =4 的話 k=3
t=a[0]; //把數組假如數組元素 A 【0】=20 t=20
for (i=0;i<k;i++) // i=0;i<3; i++
{ // 20/i !=0 跳到 else處
if ((t/j)==0) //如果t/j ==0 20/20 =0 如果成立
{ //下面這步是吧輸入數組的值相加給t
t=t*10+a[i+1]; //循環相加並乘 t=21230
b[i]=0; //對 數組 b 的0 - 3元素賦值0
}
else if ((t/j)!=0) //如果不等於0的話 20/1 !=0
{
b[i]=t/j; // 20/1=20 給數組b數據 b[0-3]=20
t=(t%j)*10+a[i+1]; //假如 20%1=0*10=0 0+10=t t=10
} // 10%1=0*10=0 0+20=t t=20
} //
for (i=0;i<k-j;i++) //i=0 i<3-1;i++
{ // i<2;
printf ("%d",b[i]); // b[0]=20, b[1]=20
}
return 0;
}
你看我的注釋哪裡不對,我覺得你應該哪裡漏什麼了 ?????????
要不你把要求寫出來,我給你寫寫

③ C語言 100位大整數除法 最好用字元串或者數組

#include <stdio.h>
#define MAXINT 1000
int compare(int a[],int b[]);
int bigplus(int a[],int b[],int c[]);
int bigsub(int a[],int b[],int c[]);
int bigmult(int a[],unsigned int b,int c[]);
int bigmult2(int a[],int b[],int c[]);
int bigdiv(int a[],unsigned int b,int c[],int *d);
int bigdiv2(int a[],int b[],int c[],int d[]);
int main(int argc, char *argv[])
{
int a[MAXINT]={10,5,4,6,5,4,3,2,1,1,1}; //被乘數或被除數
int b[MAXINT]={7,7,6,5,4,3,2,1}; //乘數或除數
int c[MAXINT],d[MAXINT]; //c[]存放商,d[]存放余數
int div=1234; //小乘數或小除數
int k=0;
int *res=&k; //小余數整數指針
bigplus(a,b,c);
bigsub(a,b,c);
bigmult(a,div,c);
bigmult2(a,b,c);
bigdiv(a,div,c,res);
bigdiv2(a,b,c,d);
getchar();
return 0;
}
int compare(int a[],int b[]) //比較大整數的大小
{
int i;
if (a[0]>b[0]) return 1; //比較a,b的位數確定返回值
else if (a[0]<b[0]) return -1;
else //位數相等時的比較
{
i=a[0];
while (a[i]==b[i]) //逐位比較
i--;
if (i==0) return 0;
else if (a[i]>b[i]) return 1;
else return -1;
}
}
int bigplus(int a[],int b[],int c[]) //大整數加法
{
int i,len;
len=(a[0]>b[0]?a[0]:b[0]); //a[0] b[0]保存數組長度,len為較長的一個
for(i=0;i<MAXINT;i++) //將數組清0
c[i]=0;
for (i=1;i<=len;i++) //計算每一位的值
{
c[i]+=(a[i]+b[i]);
if (c[i]>=10)
{
c[i]-=10; //大於10的取個位
c[i+1]++; //高位加1
}
}
if (c[i+1]>0) len++;
c[0]=len; //c[0]保存結果數組實際長度
printf("Big integers add: ";
for (i=len;i>=1;i--)
printf("%d",c[i]); //列印結果
printf("\n";
return 0;
}
int bigsub(int a[],int b[],int c[]) //大整數減法
{
int i,len;
len=(a[0]>b[0]?a[0]:b[0]); //a[0]保存數字長度,len為較長的一個
for(i=0;i<MAXINT;i++) //將數組清0
c[i]=0;
if (compare(a,b)==0) //比較a,b大小
{
printf("Result:0";
return 0;
}
else if (compare(a,b)>0)
for (i=1;i<=len;i++) //計算每一位的值
{
c[i]+=(a[i]-b[i]);
if (c[i]<0)
{
c[i]+=10; //小於0的原位加10
c[i+1]--; //高位減1
}
}
else
for (i=1;i<=len;i++) //計算每一位的值
{
c[i]+=(b[i]-a[i]);
if (c[i]<0)
{
c[i]+=10; //小於0原位加10
c[i+1]--; //高位減1
}
}
while (len>1 && c[len]==0) //去掉高位的0
len--;
c[0]=len;
printf("Big integers sub= ";
if (a[0]<b[0]) printf("-";
for(i=len;i>=1;i--) //列印結果
printf("%d",c[i]);
printf("\n";
return 0;
}
int bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度
{
int len,i;
for (i=0;i<MAXINT;i++) //數組清0
c[i]=0;
len=a[0];
for(i=1;i<=len;i++) //對每一位計算
{
c[i]+=a[i]*b;
c[i+1]+=c[i]/10;
c[i]%=10;
}
while (c[++len]>=10) //處理高位
{
c[len+1]=c[len]/10;
c[len]%=10;
}
if (c[len]==0) len--; //處理高進位為0情況
printf("Big integrs multi small integer: ";
for (i=len;i>=1;i--)
printf("%d",c[i]);
printf("\n";
}
int bigmult2(int a[],int b[],int c[]) //高精度乘以高精度
{
int i,j,len;
for (i=0;i<MAXINT;i++) //數組清0
c[i]=0;
for (i=1;i<=a[0];i++) //被乘數循環
for (j=1;j<=b[0];j++) //乘數循環
{
c[i+j-1]+=a[i]*b[j]; //將每一位計算累加
c[i+j]+=c[i+j-1]/10; //將每一次結果累加到高一位
c[i+j-1]%=10; //計算每一次的個位
}
len=a[0]+b[0]; //取最大長度
while (len>1 && c[len]==0) //去掉高位0
len--;
c[0]=len;
printf("Big integers multi: ";
for (i=len;i>=1;i--) //列印結果
printf("%d",c[i]);
printf("\n";
}
int bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度
{ //a[] 為被乘數,b為除數,c[]為結果,d為余數
int i,len;
len=a[0]; //len為a[0]的數組長度
for (i=len;i>=1;i--)
{
(*d)=10*(*d)+a[i]; //計算每一步余數
c[i]=(*d)/b; //計算每一步結果
(*d)=(*d)%b; //求模余數
}
while (len>1 && c[len]==0) len--; //去高位0
printf("Big integer div small integer: ";
for (i=len;i>=1;i--) //列印結果
printf("%d",c[i]);
printf("\tArithmetic compliment:%d",*d);
printf("\n";
}
int bigdiv2(int a[],int b[],int c[],int d[]) //高精度除以高精度
{
int i,j,len;
if (compare(a,b)<0) //被除數較小直接列印結果
{
printf("Result:0";
printf("Arithmetic compliment:";
for (i=a[0];i>=1;i--) printf("%d",a[i]);
printf("\n";
return -1;
}
for (i=0;i<MAXINT;i++) //商和余數清0
{
c[i]=0;
d[i]=0;
}
len=a[0];d[0]=0;
for (i=len;i>=1;i--) //逐位相除
{
for (j=d[0];j>=1;j--)
d[j+1]=d[j];
d[1]=a[i]; //高位*10+各位
d[0]++; //數組d長度增1
while (compare(d,b)>=0) //比較d,b大小
{
for (j=1;j<=d[0];j++) //做減法d-b
{
d[j]-=b[j];
if (d[j]<0)
{
d[j]+=10;
d[j+1]--;
}
}
while (j>0 && d[j]==0) //去掉高位0
j--;
d[0]=j;
c[i]++; //商所在位值加1
}
}
j=b[0];
while (c[j]==0 && j>0) j--; //求商數組c長度
c[0]=j;
printf("Big integers div result: ";
for (i=c[0];i>=1;i--) //列印商
printf("%d",c[i]);
printf("\tArithmetic compliment: "; //列印余數
for (i=d[0];i>=1;i--)
printf("%d",d[i]);
printf("\n");
}

④ c語言中除法為何有時可以得出數,有時卻又說等於零呢

樓主應該說的是int類型之間的除法吧。

C語言計算有一個不成文的約定,即類型轉換。
1、同類型的之間進行運算,結果就是該類型。
2、不同類型的之間進行運算,會先將低精度類型轉換到高精度類型,然後再計算。

如果兩個int類型之間做除法的話,那結果還是int類型。
比如5/3的話,商1,余數為2
比如1/3的話,商0,余數為1
結果就是商,被除數小於除數的話,結果就是0啦。

⑤ C語言中的除法怎樣有高精度如 實數型變數 Y=1/5,顯示Y=0,怎麼修改

y = 1.0/5.0
因為如果像你那樣寫的話先作int型數的運算,這時小數部分就丟了,然後轉換為double型的,加小數點後,默認為double型數的運算了,當然小數就不會丟啦

⑥ 求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;

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

procere 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;

procere 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;

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

procere 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 & molus 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 }

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

procere 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;

procere 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;

procere 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;

procere 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;

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

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

begin
init;
main;
out;
end.