永发信息网

C语言编写阶乘X,当y=x!的y的数字位数小于32位的时候,求最大的x的值

答案:2  悬赏:0  手机版
解决时间 2021-12-04 06:39
  • 提问者网友:不要迷恋哥
  • 2021-12-03 07:27
C语言编写阶乘X,当y=x!的y的数字位数小于32位的时候,求最大的x的值
最佳答案
  • 五星知识达人网友:玩世
  • 2021-12-03 07:34
你这样写y就越界了吧你说9999999999999999999999999999999这个数肯定是大于整型的最大值的追问long呢答案是16问题在于我的程序逻辑有错误,答案输不输得出来还有问题追答哈哈,我写出来了,就是没算那么大,把y取为2的31次方得到12,算法不好,我电脑算2的18次方也就是得到11已经很吃力了,再往上会等很久
如果是16的话,可能还真是10进制的32位数,可是太大了啊
16!的10进制有16位那就要换成long long int才可以
#include
#include

long int jch(long int x){ //求x的阶乘
long int num=1;
while(x!=0){
num*=x;
x--;
}
return num;
}

long int divide(long int num){ //自除,求最大阶乘元,比如120=5! 那么它的最大阶乘元(我取的名字)是5
long int n=2; //初始值为2,因为最小的阶乘就是2了吧
while(1){
if(0==num%n){ //如果该数整除n
num/=n; //将除得的商作为下一次被除数
n++; //最大阶乘元加1
}
else
break; //否则,退出循环
}
return --n; //返回,由于多加了个1,所以返回n-1
}

int main(){
long int y=0x7fffffff;
long int x=0;
while(1)
{
if( y == jch(divide(y)) ){ //如果y的最大阶乘元的阶乘等于y,则寻找成功
x=divide(y);
break;
}
else //否则y--,继续寻找
y--;
}
printf("%ld = %ld!",y,x);
return 0;
}
全部回答
  • 1楼网友:舍身薄凉客
  • 2021-12-03 08:12
你这么写太慢了,而且会溢出出错
你循环遍历,每次记住当前值的阶乘,下一个阶乘就是当前阶乘乘以下一个数
并且比较的时候如果相乘可能会溢出,先算出32位整形最大的书,除以下一个数和当前阶乘比较,以此判断下一个数阶乘会不会超过32位

好好理解下
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯