鱼C论坛

 找回密码
 立即注册
查看: 1776|回复: 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的阶乘,输出为什么不对?
小甲鱼最新课程 -> https://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的阶乘的示例代码:

  1. #include <stdio.h>
  2. #include <gmp.h>

  3. int main(void)
  4. {
  5.     mpz_t factorial;
  6.     mpz_init(factorial);
  7.    
  8.     mpz_set_ui(factorial, 1);
  9.    
  10.     int i;
  11.     for (i = 2; i <= 100; i++) {
  12.         mpz_mul_ui(factorial, factorial, i);
  13.     }
  14.    
  15.     char* result = mpz_get_str(NULL, 10, factorial);
  16.     printf("%s\n", result);
  17.    
  18.     mpz_clear(factorial);
  19.     free(result);
  20.    
  21.     return 0;
  22. }
复制代码


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

使用GMP库可以正确地计算100的阶乘,并输出正确的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

解决方案:

为了计算大整数的阶乘,可以借助字符串来表示和计算。以下是修改后的代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 20000
  4. void multiply(char *num, int digit)
  5. {
  6.     int carry = 0;
  7.     int len = strlen(num);
  8.     for (int i = 0; i < len; i++)
  9.     {
  10.         int product = (num[i] - '0') * digit + carry;
  11.         num[i] = product % 10 + '0';
  12.         carry = product / 10;
  13.     }
  14.     while (carry > 0)
  15.     {
  16.         num[len] = carry % 10 + '0';
  17.         carry /= 10;
  18.         len++;
  19.     }
  20. }
  21. void factorial(int n)
  22. {
  23.     char num[MAX];
  24.     memset(num, '0', sizeof(num));
  25.     num[0] = '1';
  26.     for (int i = 2; i <= n; i++)
  27.     {
  28.         multiply(num, i);
  29.     }
  30.     int len = strlen(num);
  31.     for (int i = len - 1; i >= 0; i--)
  32.     {
  33.         printf("%c", num[i]);
  34.     }
  35. }
  36. int main(void)
  37. {
  38.     int n;
  39.     scanf("%d", &n);
  40.     factorial(n);
  41.     return 0;
  42. }
复制代码

这段代码使用字符串num来表示大整数,并且进行乘法运算。在每次乘法运算后,需要将结果保存在num中,并且处理进位。最后,按照逆序打印出阶乘结果。

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 18:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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