如果是要求保留除法的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
}