鱼C论坛

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

[已解决]小白求助

[复制链接]
发表于 2023-11-5 21:38:28 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#define MAX 500000
int main(void)
{
        int i,k,location;
        int array[MAX] = {1};
       
        scanf("%d",&i);
        if (i == 0)
                printf("%d",1);
        else{
                for (int j = 1,m = 0;j <= i;j++){
                        array[m] *= j;
               
                while (array[m] / 10 > 0){
                        array[m+1]++;
                        if (array[m] >= 100){
                                array[m] %= 10;
                                array[m+1]++;
                        }
                        if (array[m] >= 10)
                                array[m] %=
10;
                        for (k = 1;k <= MAX;k++){
                                while (array[k] / 10 > 0){
                                        array[k+1]++;
                                        array[k] /= 10;
                                        }
                                }
                        }
                }
                location = MAX;
                while (array[--location] != 0)
                        ;
                for (;location >= 0;location--)
                        printf("%d",array[location]);
        }
       
        return 0;
}
打印100的阶乘,为什么最后的输出不对?
最佳答案
2023-11-5 21:39:13
这段代码在计算阶乘时,出现了多个问题导致最后的输出不正确。以下是修复后的代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 1000000
  4. int main(void)
  5. {
  6.     int i, k, location;
  7.     int array[MAX] = {1};
  8.     scanf("%d", &i);
  9.     if (i == 0)
  10.         printf("%d", 1);
  11.     else {
  12.         for (int j = 2; j <= i; j++) {
  13.             for (k = 0; k < MAX; k++)
  14.                 array[k] *= j;
  15.             for (k = 0; k < MAX; k++)
  16.                 if (array[k] >= 10) {
  17.                     array[k+1] += array[k] / 10;
  18.                     array[k] %= 10;
  19.                 }
  20.         }
  21.         for (location = MAX-1; location >= 0 && array[location] == 0; location--)
  22.             ;
  23.         for (; location >= 0; location--)
  24.             printf("%d", array[location]);
  25.     }
  26.     return 0;
  27. }
复制代码

修复后的代码中,我进行了以下修改:

1. 在计算阶乘时,将数组array的初始值改为1,并从j=2开始相乘。

2. 将两个while循环改为两个for循环,计算每一位的值时,先做乘法,再做进位操作。

3. 在输出结果时,去掉多余的前导零。具体做法是从最高位开始逐位扫描数组,找到第一个非零元素,然后输出其后的所有元素。

希望以上回答对您有所帮助。

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

使用道具 举报

发表于 2023-11-5 21:38:40 | 显示全部楼层
这段代码在计算100的阶乘时会出现错误。原因是数组  array  的大小只有 500000,而 100 的阶乘的位数已经超过了这个范围。因此,在计算阶乘时,数组  array  中的高位会被截断,导致计算结果不正确。

解决这个问题的方法是使用高精度计算。可以使用数组来存储每一位数字,然后按照乘法的规则进行计算,最后再将结果输出。这样可以避免位数超过数组大小的问题。

以下是一个使用高精度计算的示例代码:

  1. #include <stdio.h>

  2. #define MAX_DIGITS 1000

  3. void multiply(int result[], int x) {
  4.     int carry = 0;
  5.     for (int i = 0; i < MAX_DIGITS; i++) {
  6.         int product = result[ i] * x + carry;
  7.         result[ i] = product % 10;
  8.         carry = product / 10;
  9.     }
  10. }

  11. void print_factorial(int n) {
  12.     int result[MAX_DIGITS] = {1};
  13.     for (int i = 2; i <= n; i++) {
  14.         multiply(result, i);
  15.     }
  16.     int i = MAX_DIGITS - 1;
  17.     while (i >= 0 && result[ i] == 0) {
  18.         i--;
  19.     }
  20.     for (; i >= 0; i--) {
  21.         printf("%d", result[ i]);
  22.     }
  23.     printf("\n");
  24. }

  25. int main() {
  26.     print_factorial(100);
  27.     return 0;
  28. }
复制代码


这个程序使用一个数组  result  来存储计算结果,每一位上存储一个数字。在计算阶乘时,先将  result  初始化为 1,然后从 2 开始依次乘以每个数字,将结果累乘到  result  中。最后,从高位到低位遍历  result ,输出每一位上的数字即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-5 21:39:13 | 显示全部楼层    本楼为最佳答案   
这段代码在计算阶乘时,出现了多个问题导致最后的输出不正确。以下是修复后的代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 1000000
  4. int main(void)
  5. {
  6.     int i, k, location;
  7.     int array[MAX] = {1};
  8.     scanf("%d", &i);
  9.     if (i == 0)
  10.         printf("%d", 1);
  11.     else {
  12.         for (int j = 2; j <= i; j++) {
  13.             for (k = 0; k < MAX; k++)
  14.                 array[k] *= j;
  15.             for (k = 0; k < MAX; k++)
  16.                 if (array[k] >= 10) {
  17.                     array[k+1] += array[k] / 10;
  18.                     array[k] %= 10;
  19.                 }
  20.         }
  21.         for (location = MAX-1; location >= 0 && array[location] == 0; location--)
  22.             ;
  23.         for (; location >= 0; location--)
  24.             printf("%d", array[location]);
  25.     }
  26.     return 0;
  27. }
复制代码

修复后的代码中,我进行了以下修改:

1. 在计算阶乘时,将数组array的初始值改为1,并从j=2开始相乘。

2. 将两个while循环改为两个for循环,计算每一位的值时,先做乘法,再做进位操作。

3. 在输出结果时,去掉多余的前导零。具体做法是从最高位开始逐位扫描数组,找到第一个非零元素,然后输出其后的所有元素。

希望以上回答对您有所帮助。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 15:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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