A. pascal 高精度除法(最好是壓位的)

程序如下: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.

B. c語言求階乘累加和

題目中數據很大

於是我們有了高精度演算法

思路是什麼呢:

一個數組裡面每一位存的是十進制數三位(也可以只存一位,但是比較慢)

也可以理解成一千進制

這樣能模擬大整數的乘法、加法

#include<stdio.h>
#include<string.h>
#definemax(a,b)(a>b?a:b)
intn;
FILE*input,*output;
structbigint
{
intlen;
intnum[1100];
}fac,sum;
voidmul(intvalue){//高精度乘單精度
inti;
for(i=1;i<=fac.len;i++)
fac.num[i]=fac.num[i]*value;//每個數位乘上數
for(i=1;i<=fac.len;i++)
if(fac.num[i]>=1000){//逢千進一
fac.num[i+1]+=fac.num[i]/1000;fac.num[i]%=1000;
}
if(fac.num[fac.len+1])fac.len++;//位數可能會增加,而且最多增加1
}
voidadd()//給sum加上fac的值
{
inti;
//由於此時fac永遠大於sum所以不用判斷sum的長度
for(i=1;i<=fac.len;i++)
sum.num[i]+=fac.num[i];//每一位加上fac的值
for(i=1;i<=fac.len;i++)
if(sum.num[i]>=1000){//逢千進一
sum.num[i+1]++;sum.num[i]-=1000;//因為加法運算不可能往前進2
}
sum.len=fac.len;
if(sum.num[sum.len+1])sum.len++;
}
voidout()//輸出
{
inti;
for(i=sum.len;i>=1;i--)
{
if(i<sum.len)//壓位高精度一定要判斷位數
{//因為如果不是第一位,其他要補0,因為如果這個數是1001,就會變成11
if(sum.num[i]<10)fprintf(output,"00");
elseif(sum.num[i]<100)fprintf(output,"0");
}
fprintf(output,"%d",sum.num[i]);
}
fputc(' ',output);
}
intmain(){
input=fopen("factor.in","r");
output=fopen("factor.out","w");
memset(fac.num,0,sizeoffac.num);
memset(sum.num,0,sizeofsum.num);
fscanf(input,"%d",&n);
inti;
fac.len=sum.len=1;//初始賦成1
fac.num[1]=sum.num[1]=1;
for(i=2;i<=n;i++)
{
mul(i);
add();
}
out();
fclose(input);fclose(output);
return0;
}

C. 高精度加法壓位 pascal

讀入
Var
ch:char;

x:=1;l1:=0;
while not eoln Do begin
read(ch);
x=x*10+ord(ch)-48;
if x>=1000 Then Begin
Inc(l1);
a[l1]=a[l1]+x mod 1000;
a[l1+1]=x div 1000;
End;
end;
In(l1);
{b數組同理}
{——————————————————————————————————————}
{計算過程}
l1=a[0];{a[0]表示a的長度}
l2=b[0];{。。。。。。。}
l:=max(l1,l2);
for i:=1 To l DO Begin
c[i]=a[i]+b[i];
c[i+1]=c[i] div 1000;
c[i]=c[i] mod 1000;
End;
if c[l]>1000 Then Begin
Inc(l);
c[l]=c[l-1]div 1000;
c[l-1]=c[l-1]mod 1000;
End;

D. c語言求大整數階乘哪裡錯了

#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>

#definemod10000

usingnamespacestd;

intlen=1,n; //len表示字元串的長度
intans[1000010]; //保存最終結果的數組

voidprework(){
ios::sync_with_stdio(false);
scanf("%d",&n); //輸入n,程序是為了輸出n!
}

voidcheng(intt){ //目的是將一個t乘入數組
intk=0; //k是用來處理進位的
for(inti=1;i<=len;i++){
ans[i]=ans[i]*t+k;
k=ans[i]/mod; //壓位運算,相當於萬進制
ans[i]%=mod;
if(k>0&&i==len) //處理進位
len++;
}
}

voidmainwork(){
ans[1]=1;
for(inti=2;i<=n;i++)
cheng(i); //階乘就是一個個乘...似乎是拙劣的演算法
printf("%d",ans[len]); //最後輸出結果
for(inti=len-1;i>=1;i--)
printf("%04d",ans[i]); //萬進制下不足萬位要補零,故為「%04d」
}

intmain(){
prework();
mainwork();
return0;
}

E. c語言中如何保留小數點五十位參與運算。。。

保留多位是顯示的問題
有多少位參與運算是機器能力的問題。32位機與64位機運算能力不同。double和float類型所能處理的數據精度也不同。

F. 請您幫忙翻譯一下

The minimum of delivery time for the material DKUYYI is 10 weeks,but the desirable delivery time in your order is within 5 weeks .We will try our best to pull in and if any progress there we will inform you immediately. 我說那些拿google翻譯的朋友 我咋感覺樓主要翻譯的這句話連漢語的意思你們都沒看懂呢... 祝樓主這單生意能成...

G. 高精度(乘法)壓位,要詳解,最好有代碼pascal,好的追加分數!

program HighPrecision4_Multiply2;
const
maxlen=2000;
type
hp=record
len:integer;
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:hp; {

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

procere Multiply(a,b:hp;var c:hp);
var i,j,len:integer;
begin
fillchar(c,sizeof(c),0);
for i:=1 to a.len do
for j:=1 to b.len do
begin
inc(c.s[i+j-1],a.s[i]*b.s[j]);
inc(c.s[i+j],c.s[i+j-1] div 10);
c.s[i+j-1]:=c.s[i+j-1] mod 10;
end;
len:=a.len+b.len+1;
{
the proct of a number with i digits and a number with j digits
can only have at most i+j+1 digits
}
while(len>1)and(c.s[len]=0) do dec(len);
c.len:=len;
end;

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

begin
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;
main;
PrintHP(y);
end.

H. c++ 高精度加法 壓位 求糾正

不知道啥叫壓位 高精度加法
代碼中有一些錯誤,如樓上指出的i=i的錯誤
add函數中for循環里少";":
for(int i=i;i<=l;i++)
{
ans[i]=ans[i]+t_a[i]+t_b[i];
ans[i+1]=ans[i]/deep;
ans[i]=ans[i]%deep //這兒缺少;
最後輸出時輸出ans首地址的錯誤:
for(int i=l;i>=1;i--)
printf("%d",ans); //應該是ans[i]吧?
另外感覺邏輯上也有錯,直接就沒太看明白
以下代碼可以正確編譯運行,可以計算99999位以內的正整數的加法,但無法處理負數和小數
#include<cstdio>
#include<cstring>
const int deep=100000;
int X[5]={1,10,100,1000,10000};
char a[100000],b[100000];
int t_a[100000],t_b[100000],ans[100000];
int lena,lenb,len,la,lb,l;
void ADD(void)
{
memset(ans,0,sizeof(ans));
int stepUp = 0;
if(la>lb) l=la;
else l=lb;
int i;
for(i=0; i<la && i<lb; i++)
{
int tmp = t_a[i]+t_b[i] +stepUp;
stepUp = 0;
if(tmp>=10)
stepUp = 1;
ans[i] = tmp%10;
}
if(i == la)
{
for(; i<lb; i++)
{
int tmp = t_b[i] +stepUp;
stepUp = 0;
if(tmp>=10)
stepUp = 1;
ans[i] = tmp%10;
}
if(stepUp)
{
ans[i] = 1;
l += 1;
}
}
else if(i == lb)
{
for(; i<la; i++)
{
int tmp = t_a[i] +stepUp;
stepUp = 0;
if(tmp>=10)
stepUp = 1;
ans[i] = tmp%10;
}
if(stepUp)
{
ans[i] = 1;
l += 1;
}
}
}
int main()
{
memset(t_a,0,sizeof(t_a));
memset(t_b,0,sizeof(t_b));
scanf("%s",a);
lena=strlen(a);
la=0;
for(int i=lena-1; i>=0; i--)
{
t_a[la++]= a[i]-'0';
}
scanf("%s",b);
lenb=strlen(b);
lb=0;
for(int i=lenb-1; i>=0; i--)
{
t_b[lb++]=b[i]-'0';
}

ADD();

for(int i=l-1;i>=0;i--)
printf("%d",ans[i]);
printf("\n");
return 0;
}

I. C++ 高精度運算中如何壓位

用動態分配數組的大小,malloc函數。記得用完釋放,free函數。