
一道关于C语言高精度输出的问题,请各位C语言高手们看看
如何高精度的输出一个实数的高阶,如78.443的12次方,或者更大99次方请各位C语言大虾们帮帮忙,最好能给出代码……谢了哈O(∩_∩)O~...
如何高精度的输出一个实数的高阶,如78.443的12次方,或者更大99次方
请各位C语言大虾们帮帮忙,最好能给出代码……谢了哈O(∩_∩)O~ 展开
请各位C语言大虾们帮帮忙,最好能给出代码……谢了哈O(∩_∩)O~ 展开
4个回答
展开全部
ls的做法肯定行不通,因为数据范围肯定会超,这题挺不好写的,要用数组来存
比如开个unsigned int a[10000]的数组,78.443的12次方要这样算:
先计算小数点位置,现在有3位小数,12次方会有3*12=36位小数(因为每次都是自乘自,所以最末位不会因为相乘得0而丢掉,所以能确保最终小数的数目)
然后把此小数去掉小数点,为78443,再让它自乘,>=100000的数存到下一个int去,
比如78443*78443=4294967295>100000,则a[0]=67295,a[1]=42949,然后再让a[0]和a[1]分别乘以78443(要确保每位乘以78443都不会溢出才行,所以我取100000作为它每位数的上限),最后只要把它连接起来就好了...
要是求有效位更高的数就要用到_INT64类型数组了,再高些连这个都不行,那就只能按大数乘法把它分开算,比如算1234567.7654321的N次方,我们只能把它分成几个数用更复杂的求法来算了(比如分成两个数A=1234567,B=7654321,算成(A*10^7+B)^N)来计算
程序的大数算法是非常复杂的,能掌握好它你的C语言功底肯定就很高了
比如开个unsigned int a[10000]的数组,78.443的12次方要这样算:
先计算小数点位置,现在有3位小数,12次方会有3*12=36位小数(因为每次都是自乘自,所以最末位不会因为相乘得0而丢掉,所以能确保最终小数的数目)
然后把此小数去掉小数点,为78443,再让它自乘,>=100000的数存到下一个int去,
比如78443*78443=4294967295>100000,则a[0]=67295,a[1]=42949,然后再让a[0]和a[1]分别乘以78443(要确保每位乘以78443都不会溢出才行,所以我取100000作为它每位数的上限),最后只要把它连接起来就好了...
要是求有效位更高的数就要用到_INT64类型数组了,再高些连这个都不行,那就只能按大数乘法把它分开算,比如算1234567.7654321的N次方,我们只能把它分成几个数用更复杂的求法来算了(比如分成两个数A=1234567,B=7654321,算成(A*10^7+B)^N)来计算
程序的大数算法是非常复杂的,能掌握好它你的C语言功底肯定就很高了

2022-12-05 广告
图形化编程简单理解为用积木块形式编程,scratch和python也是其中的一种,属于入门级编程,以其简单生动的画面获得无数学生的喜爱,深圳市创客火科技有限公司是一家做教育无人机的公司,旗下有编程无人机,积木无人机及室内外编队,每款飞机含有...
点击进入详情页
本回答由--提供
展开全部
这是我原来的一个程序,次方不能开得太大,你自己稍微改一下吧:
#include <stdio.h>
#include <string.h>
int main(){
int i,j,n,dec,num,fg,x,y;
int a[1300];
char tp[100];
while(scanf("%s%d",tp,&n)!=EOF){
dec=0;
fg=0;
num=0;
for(i=0;tp[i];i++)
if(tp[i]=='.')
fg=1;
if(fg){
for(i=strlen(tp)-1;tp[i]=='0';i--);
if(tp[i]=='.')
fg=0;
tp[i+1]='\0';
for(dec=0;tp[i]!='.';i--,dec++);
for(j=i+dec;i<=j;i++)
tp[i]=tp[i+1];
}
for(i=0;tp[i];i++)
num=num*10+tp[i]-'0';
for(i=0,x=y=j=strlen(tp),j--;i<j;i++,j--)
tp[i]^=tp[j]^=tp[i]^=tp[j];
if(num==0){
printf("0\n");
continue;
}
for(i=0;i<130;i++)
a[i]=0;
for(i=0;tp[i];i++)
a[i]=tp[i]-'0';
for(j=0;j<n-1;j++){
for(i=0;i<x;i++)
a[i]*=num;
for(i=0,x+=y;i<x;i++)
if(a[i]>=10){
a[i+1]+=a[i]/10;
a[i]%=10;
}
}
for(;a[x]==0;x--);
dec*=n;
if(fg)
if(x<dec-1){
printf(".%0*d",dec-x-1,0);
for(;x>=0;x--)
printf("%d",a[x]);
}
else{
for(;x>dec-1;x--)
printf("%d",a[x]);
printf(".");
for(;x>=0;x--)
printf("%d",a[x]);
}
else
for(;x>=0;x--)
printf("%d",a[x]);
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main(){
int i,j,n,dec,num,fg,x,y;
int a[1300];
char tp[100];
while(scanf("%s%d",tp,&n)!=EOF){
dec=0;
fg=0;
num=0;
for(i=0;tp[i];i++)
if(tp[i]=='.')
fg=1;
if(fg){
for(i=strlen(tp)-1;tp[i]=='0';i--);
if(tp[i]=='.')
fg=0;
tp[i+1]='\0';
for(dec=0;tp[i]!='.';i--,dec++);
for(j=i+dec;i<=j;i++)
tp[i]=tp[i+1];
}
for(i=0;tp[i];i++)
num=num*10+tp[i]-'0';
for(i=0,x=y=j=strlen(tp),j--;i<j;i++,j--)
tp[i]^=tp[j]^=tp[i]^=tp[j];
if(num==0){
printf("0\n");
continue;
}
for(i=0;i<130;i++)
a[i]=0;
for(i=0;tp[i];i++)
a[i]=tp[i]-'0';
for(j=0;j<n-1;j++){
for(i=0;i<x;i++)
a[i]*=num;
for(i=0,x+=y;i<x;i++)
if(a[i]>=10){
a[i+1]+=a[i]/10;
a[i]%=10;
}
}
for(;a[x]==0;x--);
dec*=n;
if(fg)
if(x<dec-1){
printf(".%0*d",dec-x-1,0);
for(;x>=0;x--)
printf("%d",a[x]);
}
else{
for(;x>dec-1;x--)
printf("%d",a[x]);
printf(".");
for(;x>=0;x--)
printf("%d",a[x]);
}
else
for(;x>=0;x--)
printf("%d",a[x]);
printf("\n");
}
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用long double应该可以给出足够的小数点了吧
long double r()
{
long double result=1;
long double multip=78.443;
int exp=12
for (int i=1; i<=exp; i++){
result=result*multip;}
return result;
}
long double r()
{
long double result=1;
long double multip=78.443;
int exp=12
for (int i=1; i<=exp; i++){
result=result*multip;}
return result;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
大数计算啊 偷懒一点,只做大数的加减法
乘法除法用连加连减来实现
乘法除法用连加连减来实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询