c语言中如何保留小数点五十位参与运算。。。

Python027

c语言中如何保留小数点五十位参与运算。。。,第1张

做什么运算?加减乘除么?建议用高精度计算的方法,把数保存到数组中,然后对数组操作。

如果是要求保留除法的50位结果,请使用高精度除法(确实很麻烦……)

最后,高精度可以压位提高效率

欢迎交流:)

void ADD(void)

{

memset(ans,0,sizeof(ans))

if(la>lb) l=la

else l=lb

for(int i=ii<=li++)

仔细看 你写的i=i i是一个不知道是什么的数 这程序我大概看了下,应该是对的,把他改成i=0应该就好了

题目中数据很大

于是我们有了高精度算法

思路是什么呢:

一个数组里面每一位存的是十进制数三位(也可以只存一位,但是比较慢)

也可以理解成一千进制

这样能模拟大整数的乘法、加法

#include<stdio.h>

#include<string.h> 

#define max(a,b) (a>b?a:b)

int n

FILE * input, * output

struct bigint

{

int len

int num[1100]

}fac,sum

void mul(int value){//高精度乘单精度

int i

for (i=1i<=fac.leni++)

fac.num[i]=fac.num[i]*value//每个数位乘上数

for (i=1i<=fac.leni++)

if (fac.num[i]>=1000) {//逢千进一

fac.num[i+1]+=fac.num[i]/1000fac.num[i]%=1000

}

if (fac.num[fac.len+1]) fac.len++//位数可能会增加,而且最多增加1

}

void add()//给sum加上fac的值

{

int i

//由于此时fac永远大于sum所以不用判断sum的长度

for (i=1i<=fac.leni++)

sum.num[i]+=fac.num[i]//每一位加上fac的值

for (i=1i<=fac.leni++)

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++

}

void out()//输出

{

int i

for (i=sum.leni>=1i--)

{

if (i<sum.len) //压位高精度一定要判断位数

{//因为如果不是第一位,其他要补0,因为如果这个数是1001,就会变成11

 if (sum.num[i]<10) fprintf(output,"00")

else if (sum.num[i]<100) fprintf(output,"0")

}

fprintf(output,"%d",sum.num[i])

}

fputc('\n',output)

}

int main(){

input = fopen("factor.in","r")

output = fopen("factor.out","w")

memset(fac.num,0,sizeof fac.num)

memset(sum.num,0,sizeof sum.num) 

fscanf(input,"%d",&n)

int i

fac.len = sum.len = 1//初始赋成1

fac.num[1] = sum.num[1] = 1

for (i=2i<=ni++)

{

mul(i)

add()

}

out()

fclose(input)fclose(output)

return 0

}