鱼C论坛

 找回密码
 立即注册
查看: 1255|回复: 2

小白求助

[复制链接]
发表于 2023-11-6 07:33:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#define MAX 40000
int main(void)
{
        int i,k,j,location;
        int array[MAX] = {0};
       
        scanf("%d",&i);
        array[0] = 1;
        if (i == 0)
                printf("1");
        else{
                for (k = 1;k <= i;k++){
                        for (j = 0;j < MAX;j++)
                                array[j] *= k;
                        for (j = 0;j < MAX;j++)
                                if (array[j] >= 10)
                                        array[j+1] += array[j] / 10;
                                array[j] %= 10;
                }
               
                               
                location = MAX-1;
                for (;location >= 0;location--){
                        if (array[location] != 0)
                                break;
                }
                for (;location >= 0;location--)
                        printf("%d",array[location]);
               
                }
       
       
        return 0;
}
打印100的阶乘,输出为什么不对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-6 07:33:49 | 显示全部楼层
这段代码在计算100的阶乘时会遇到溢出问题。由于100的阶乘非常大,超过了int类型的表示范围。因此,无法正确计算100的阶乘。

在代码中,使用一个数组array[MAX]来保存阶乘的结果。每次计算阶乘时,将array数组中的每个元素与当前的k相乘。然后,对数组中的每个元素进行进位处理,以确保每个元素的值在0到9之间。

然而,由于100的阶乘非常大,超过了int类型的表示范围,所以无法正确地进行计算。因此,输出结果不正确。

解决这个问题的一种方法是使用大数运算库,例如GMP(GNU Multiple Precision Arithmetic Library)。这些库提供了高精度计算的函数,可以处理大数运算。

以下是使用GMP库计算100的阶乘的示例代码:
#include <stdio.h>
#include <gmp.h>

int main(void)
{
    mpz_t factorial;
    mpz_init(factorial);
    
    mpz_set_ui(factorial, 1);
    
    int i;
    for (i = 2; i <= 100; i++) {
        mpz_mul_ui(factorial, factorial, i);
    }
    
    char* result = mpz_get_str(NULL, 10, factorial);
    printf("%s\n", result);
    
    mpz_clear(factorial);
    free(result);
    
    return 0;
}

这段代码使用了GMP库中的mpz_t类型来表示大数,并使用mpz_init()函数进行初始化。然后,使用mpz_set_ui()函数将factorial设置为1。接下来,使用mpz_mul_ui()函数将factorial与每个i相乘,从2到100。最后,使用mpz_get_str()函数将结果转换为字符串,并打印出来。

使用GMP库可以正确地计算100的阶乘,并输出正确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-6 07:35:40 | 显示全部楼层
问题分析:

这段代码的问题在于数组array的大小为MAX,而且MAX的值被设定为40000。然而,计算100的阶乘结果的数值会非常大,远远超过了数组array的容量。因此,数组array无法存储完整的阶乘结果。

解决方案:

为了计算大整数的阶乘,可以借助字符串来表示和计算。以下是修改后的代码:
#include <stdio.h>#include <string.h>#define MAX 20000void multiply(char *num, int digit){    int carry = 0;    int len = strlen(num);    for (int i = 0; i < len; i++)    {        int product = (num[i] - '0') * digit + carry;        num[i] = product % 10 + '0';        carry = product / 10;    }    while (carry > 0)    {        num[len] = carry % 10 + '0';        carry /= 10;        len++;    }}void factorial(int n){    char num[MAX];    memset(num, '0', sizeof(num));    num[0] = '1';    for (int i = 2; i <= n; i++)    {        multiply(num, i);    }    int len = strlen(num);    for (int i = len - 1; i >= 0; i--)    {        printf("%c", num[i]);    }}int main(void){    int n;    scanf("%d", &n);    factorial(n);    return 0;}
这段代码使用字符串num来表示大整数,并且进行乘法运算。在每次乘法运算后,需要将结果保存在num中,并且处理进位。最后,按照逆序打印出阶乘结果。

请尝试运行修改后的代码,并检查输出结果是否正确。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 13:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表