Boring1031 发表于 2022-4-16 23:08:57

c语言阶乘

有没有大佬会写呢,以及快掉没头发了{:10_255:}

ba21 发表于 2022-4-16 23:31:23

2个for就可以了
#include <stdio.h>

int factorial(int n)
{
        int i, product;

        product = 1;
        for(i=n; i>0; i--)
        {
                product *= i;
        }
        return product;
}

int main(void)
{
        int i, n, sum;
       
        printf("请输入:");
        scanf("%d", &n);

        sum = 0;
        for(i=n; i>0; i--)
        {
                sum += factorial(i);
        }
       
        printf("结果:%d\n", sum);
}

jhq999 发表于 2022-4-17 07:22:21

本帖最后由 jhq999 于 2022-4-17 08:35 编辑

ba21 发表于 2022-4-16 23:31
2个for就可以了

n<=50,高精度,unsigned long long 也不够
可以利用乘法和加法的竖算式,把数分段储存,分段乘积
举个简单的里子
4567*25
char a1={4,5,6,7},a2={2,5},a3={0};
a3=a1*a2={0,0,20,25,30,35}//进位={0,2,(20+2)%10=2,(25+3)%10=8,(30+35/10)%10=3,35%10=5}={0,2,2,8,3,5}
a3=a1*a2+a3={0,8,10,12,14,0}+{0,2,2,8,3,5}//进位={0,9,1.3,4,0}+{0,2,2,8,3,5}={0,9+2,1+2,3+8,4+3,0+5}={0,11,3,11,7,5}//进位={1,1,4,1,7,5}
我是用每个字节存10进制,好理解点,你也可以用int存10000进制,道理都是一样的

傻眼貓咪 发表于 2022-4-17 09:39:30

本帖最后由 傻眼貓咪 于 2022-4-17 09:42 编辑

题目写明 n <= 50 啊,根本超出储存范围了,确实唯一方法就如楼上大佬说的那样,分段计算了。

Boring1031 发表于 2022-4-17 11:10:59

ba21 发表于 2022-4-16 23:31
2个for就可以了

这个算不了50那么大的呀

Boring1031 发表于 2022-4-17 11:12:43

傻眼貓咪 发表于 2022-4-17 09:39
题目写明 n

分段计算要怎么实现啊,我有点看不懂{:10_262:}

傻眼貓咪 发表于 2022-4-17 11:33:04

Boring1031 发表于 2022-4-17 11:12
分段计算要怎么实现啊,我有点看不懂

给你基础代码参考吧,因为真正题解太长,所以有点懒得写:#include <stdio.h>
#define N 5

// 乘法
void mul(int* A, int* B) {
        int C = { 0 };
        for (int b = N - 1; b > 0; b--) {
                for (int a = N - 1; a > 0; a--) {
                        C += ((A * B) + C) % 10;
                        C += ((A * B) + C) / 10;
                }
        }
        for (int i = N - 1, j = 0; j < N; i++, j++) A = C;
}

// 打印
void show(int* A) {
        int flag = 0;
        for (int i = 0; i < N; i++) {
                if (A) flag = 1;
                if (flag) printf("%d", A);
        }
}

int main() {
        int
                A = { 0, 0, 3, 5, 4 }, // A = 354
                B = { 0, 0, 0, 2, 4 }; // B = 24

        mul(A, B); // A = A*B
        show(A); // A = 8496

        return 0;
}

ba21 发表于 2022-4-17 13:38:47

本帖最后由 ba21 于 2022-4-17 13:43 编辑

Boring1031 发表于 2022-4-17 11:10
这个算不了50那么大的呀

没注意。
原理差不多。搞2个大数相加,相乘函数就解决了。
代码没有处理内存释放。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Max(int a,int b)
{
        return a > b ? a : b;
}

// 大数相加
char* AddBigNumber(char *s, char *p)
{
        int x = 0;
        int len1 = strlen(s);         /*获得字符串长度*/
        int len2 = strlen(p);
        int len3 = Max(len1--, len2--) + 1;      /*结果的长度最大应为较长字符串长度+1*/
        char *arr;
        arr = (char*)malloc(sizeof(char)*(len3+1));
      /*为结果申请存储空间,+1是因为末尾有一个'\0'*/
        arr = &arr;       /*因为是从末尾开始相加,所以指针跳转到末尾*/
        *arr = '\0';
        while(len1 >= 0 || len2 >= 0)/*当两个字符串都走完了才结束*/
        {
                if(len1 >= 0)
                        x += s - '0';
                if(len2 >= 0)
                        x += p - '0';
                *(--arr) = (x % 10) + '0';       /*将结果对10取余赋给arr*/
                x /= 10;            /*重置为上一次运算的进位*/
        }
        if(x == 1)         /*如果循环完后还有进位*/
                *(--arr) = '1';
        return arr;
}

// 大数相乘
char *MultipyBigNumber(char *s, char *p)
{
    int i, j, x, bit1, bit2;
    int len1 = strlen(s);
    int len2 = strlen(p);
    int len3 = len1 + len2; /* 结果的位数最大应为两个长度相加 */

    char *arr;
    arr = (char*)malloc(sizeof(char)*(len3+1));

    arr = '\0';

    arr = &arr;
    len1--;
    len2--;
    i = x = 0;

    while(i < len3 - 1 || x != 0)
    {
      for(j = 0; j <= i; j++)
      {
            bit1 = len1 - i + j; /* 第一个数从当前最高位开始递减到个位 */
            bit2 = len2 - j; /* 第二个数从个位到当前最高位 */
            if(bit1 >= 0 && bit2 >= 0) /* 当两个位数都有效才相乘,防止出现位数不相称情况 */
                x += (s - '0') * (p - '0');
      }

      *(--arr) = x % 10 + '0';
      x /= 10;
      i++;
    }

    if(*arr++ == '0') /* 如果结果为0,只返回一个0即可,不用返回n个0 */
      *arr = '\0';

    return --arr;
}

char *factorial(int n)
{
    int i;
    char *product;
    char buf;

    product=NULL;
    for(i=n; i>0; i--)
    {
      if(product==NULL)
      {
            product = MultipyBigNumber("1", itoa(i, buf, 10));
            continue;
      }
      product = MultipyBigNumber(product, itoa(i, buf, 10));
    }

    return product;
}

int main(void)
{
    int i, n;
    char buf;
    char *sum;

    printf("请输入:");
    scanf("%d", &n);

    sum=NULL;
    for(i=n; i>0; i--)
    {
      if(sum==NULL)
      {
            sum = AddBigNumber("0", factorial(i));
            continue;
      }
      sum = AddBigNumber(sum, factorial(i));
    }

    printf("结果%s\n", sum);
}

foxiangzun 发表于 2022-4-17 22:18:24

#include <stdio.h>

int main()
{
    int m = 1, n, i, j, sum = 0;
    printf("请输入需要计算的阶乘最大数: ");
    scanf("%d", &n);
    //外层循环,控制加法
    for (i = 1; i <= n; i++)
    {
      //内存循环,控制每个数的阶乘
      for (j = 1; j <= i; j++)
      {
            m *= j;
      }
      //阶乘相加
      sum += m;
      m = 1;   //将每个数阶乘算好后,对基数做初始化
    }
    printf("sum = %d", sum);
    return 0;
}
页: [1]
查看完整版本: c语言阶乘