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函数。