鱼C论坛

 找回密码
 立即注册
查看: 1164|回复: 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
这段代码在计算阶乘时,出现了多个问题导致最后的输出不正确。以下是修复后的代码:
#include <stdio.h>#include <string.h>#define MAX 1000000int main(void){    int i, k, location;    int array[MAX] = {1};    scanf("%d", &i);    if (i == 0)        printf("%d", 1);    else {        for (int j = 2; j <= i; j++) {            for (k = 0; k < MAX; k++)                array[k] *= j;            for (k = 0; k < MAX; k++)                if (array[k] >= 10) {                    array[k+1] += array[k] / 10;                    array[k] %= 10;                }        }        for (location = MAX-1; location >= 0 && array[location] == 0; location--)            ;        for (; location >= 0; location--)            printf("%d", array[location]);    }    return 0;}
修复后的代码中,我进行了以下修改:

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

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

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

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

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

使用道具 举报

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

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

以下是一个使用高精度计算的示例代码:
#include <stdio.h>

#define MAX_DIGITS 1000

void multiply(int result[], int x) {
    int carry = 0;
    for (int i = 0; i < MAX_DIGITS; i++) {
        int product = result[ i] * x + carry;
        result[ i] = product % 10;
        carry = product / 10;
    }
}

void print_factorial(int n) {
    int result[MAX_DIGITS] = {1};
    for (int i = 2; i <= n; i++) {
        multiply(result, i);
    }
    int i = MAX_DIGITS - 1;
    while (i >= 0 && result[ i] == 0) {
        i--;
    }
    for (; i >= 0; i--) {
        printf("%d", result[ i]);
    }
    printf("\n");
}

int main() {
    print_factorial(100);
    return 0;
}

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

使用道具 举报

发表于 2023-11-5 21:39:13 | 显示全部楼层    本楼为最佳答案   
这段代码在计算阶乘时,出现了多个问题导致最后的输出不正确。以下是修复后的代码:
#include <stdio.h>#include <string.h>#define MAX 1000000int main(void){    int i, k, location;    int array[MAX] = {1};    scanf("%d", &i);    if (i == 0)        printf("%d", 1);    else {        for (int j = 2; j <= i; j++) {            for (k = 0; k < MAX; k++)                array[k] *= j;            for (k = 0; k < MAX; k++)                if (array[k] >= 10) {                    array[k+1] += array[k] / 10;                    array[k] %= 10;                }        }        for (location = MAX-1; location >= 0 && array[location] == 0; location--)            ;        for (; location >= 0; location--)            printf("%d", array[location]);    }    return 0;}
修复后的代码中,我进行了以下修改:

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

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

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

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

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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