c语言 x的x次方 用2种以上方法
发布网友
发布时间:2022-04-28 16:26
我来回答
共5个回答
热心网友
时间:2022-06-19 17:13
方法1:
递归、循环、楼上的说的很详细了
方法2:
高精度+二分
下附法2的程序,大概在x=5000时可以1s跑出(我的7年老电脑上。。。)
你的机子肯定能跑更大的。。。
结果的位数如果不够在maxn那里改,不过谁也算不出1000w位吧,应该够了。。。
在文件"hello.in"中输入,输出在"hello.out"
#include<stdio.h>
#define
maxn
10000000
#define
max(a,b)
a>b?a:b
int
x,a[maxn],b[maxn],o;
int
ans[maxn],p;
int
s3[maxn];
void
Mult(int
s1[],int
*l1,int
s2[],int
l2)
{
int
i,j;
for(i=1;
i<=*l1+l2+2;
i++)
s3[i]=0;
for(i=1;
i<=*l1;
i++)
for(j=1;
j<=l2;
j++)
s3[i+j-1]+=s1[i]*s2[j];
j=*l1+l2-1;
for(i=1;
i<=j;
i++)
if(s3[i]>9)s3[i+1]+=s3[i]/10,s3[i]%=10,j=max(j,i+1);
for(i=1;
i<=j;
i++)
s1[i]=s3[i];
*l1=j;
}
void
Init(void)
{
int
i,j=0,k;
i=x;
p=1;
ans[1]=1;
for(;i;i=i>>1)
a[++j]=i&1;
while(x)
b[++o]=x%10,x/=10;
for(i=j;
i;
i--)
{
Mult(ans,&p,ans,p);
if(a[i])
Mult(ans,&p,b,o);
}
for(i=p;
i>=1;
i--)
printf("%ld",ans[i]);
printf("\n");
}
int
main(void)
{
freopen("hello.in","r",stdin);
freopen("hello.out","w",stdout);
scanf("%ld",&x);
Init();
return
0;
}
热心网友
时间:2022-06-19 17:13
方法1: 递归、循环、楼上的说的很详细了
方法2: 高精度+二分
下附法2的程序,大概在x=5000时可以1s跑出(我的7年老电脑上。。。)
你的机子肯定能跑更大的。。。
结果的位数如果不够在maxn那里改,不过谁也算不出1000w位吧,应该够了。。。
在文件"hello.in"中输入,输出在"hello.out"
#include<stdio.h>
#define maxn 10000000
#define max(a,b) a>b?a:b
int x,a[maxn],b[maxn],o;
int ans[maxn],p;
int s3[maxn];
void Mult(int s1[],int *l1,int s2[],int l2)
{
int i,j;
for(i=1; i<=*l1+l2+2; i++) s3[i]=0;
for(i=1; i<=*l1; i++) for(j=1; j<=l2; j++) s3[i+j-1]+=s1[i]*s2[j];
j=*l1+l2-1;
for(i=1; i<=j; i++) if(s3[i]>9)s3[i+1]+=s3[i]/10,s3[i]%=10,j=max(j,i+1);
for(i=1; i<=j; i++) s1[i]=s3[i];
*l1=j;
}
void Init(void)
{
int i,j=0,k; i=x; p=1; ans[1]=1;
for(;i;i=i>>1) a[++j]=i&1;
while(x) b[++o]=x%10,x/=10;
for(i=j; i; i--)
{
Mult(ans,&p,ans,p);
if(a[i]) Mult(ans,&p,b,o);
}
for(i=p; i>=1; i--) printf("%ld",ans[i]); printf("\n");
}
int main(void)
{
freopen("hello.in","r",stdin);
freopen("hello.out","w",stdout);
scanf("%ld",&x);
Init();
return 0;
}
热心网友
时间:2022-06-19 17:14
//方法1:使用库函数pow
#include<stdio.h>
#include<math.h>
int main(){
double x,y;
printf("x=");
scanf("%lf",&x);
y=pow(x,x);
printf("y=%.4lf\n",y);
return 0;
}
////////////////////////////////////////////////////
//方法2:自定义求x的y次方的函数
#include<stdio.h>
#include<math.h>
double mypow(double x, double y){
return exp(x*log(x));
}
int main(){
double x,y;
printf("x=");
scanf("%lf",&x);
y=mypow(x,x);
printf("y=%.4lf\n",y);
return 0;
}
////////////////////////////////////////////////////////
//此外,如果x为整数,自定义函数mypow还可以通过循环实现:
//方法3:自定义求x的y次方的函数
#include<stdio.h>
double mypow(int x, int y){
double z=1;
int i;
for(i=1; i<=y; i++)
z*=x;
return z;
}
//注:函数返回类型定义为double是为了能计算较大的数
int main(){
int x;
double y;
printf("x=");
scanf("%d",&x);
y=mypow(x,x);
printf("y=%.4lf\n",y);
return 0;
}
热心网友
时间:2022-06-19 17:14
这个开整型int,估计只能算到5^5=3235,到了6^6=46656>32767肯定报错
开长整long,估计只能算到10^10,到了11^11>2^15=2147483648也报错
肯定要用高精度计算高精度的乘法,我是懒得熬夜写这个,你们谁会写的写一下吧
热心网友
时间:2022-06-19 17:15
我会写。
本来想这个号上12000分就准备刀*入库马放南山金盆洗手的。
这个问题就作为我这个号最后回答的问题吧。
如果真有诚意可以采用我为最佳答案,然后我把程序用消息发给你。(程序短小精炼,比如可以求99的99次方等等)