鱼C论坛

 找回密码
 立即注册
查看: 4089|回复: 8

c语言阶乘

[复制链接]
发表于 2022-4-16 23:08:57 | 显示全部楼层 |阅读模式

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

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

x
有没有大佬会写呢,以及快掉没头发了
CJDTX{AF_A0$(482W%YMHNH.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 23:31:23 | 显示全部楼层
2个for就可以了
  1. #include <stdio.h>

  2. int factorial(int n)
  3. {
  4.         int i, product;

  5.         product = 1;
  6.         for(i=n; i>0; i--)
  7.         {
  8.                 product *= i;
  9.         }
  10.         return product;
  11. }

  12. int main(void)
  13. {
  14.         int i, n, sum;
  15.        
  16.         printf("请输入:");
  17.         scanf("%d", &n);

  18.         sum = 0;
  19.         for(i=n; i>0; i--)
  20.         {
  21.                 sum += factorial(i);
  22.         }
  23.        
  24.         printf("结果:%d\n", sum);
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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]={4,5,6,7},a2[2]={2,5},a3[6]={0};
a3=a1*a2[1]={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[0]+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进制,道理都是一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 09:39:30 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-4-17 09:42 编辑

题目写明 n <= 50 啊,根本超出储存范围了,确实唯一方法就如楼上大佬说的那样,分段计算了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-17 11:10:59 | 显示全部楼层
ba21 发表于 2022-4-16 23:31
2个for就可以了

这个算不了50那么大的呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-17 11:12:43 | 显示全部楼层

分段计算要怎么实现啊,我有点看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 11:33:04 | 显示全部楼层
Boring1031 发表于 2022-4-17 11:12
分段计算要怎么实现啊,我有点看不懂

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

  3. // 乘法
  4. void mul(int* A, int* B) {
  5.         int C[N << 1] = { 0 };
  6.         for (int b = N - 1; b > 0; b--) {
  7.                 for (int a = N - 1; a > 0; a--) {
  8.                         C[a + b] += ((A[a] * B[b]) + C[b]) % 10;
  9.                         C[a + b - 1] += ((A[a] * B[b]) + C[b]) / 10;
  10.                 }
  11.         }
  12.         for (int i = N - 1, j = 0; j < N; i++, j++) A[j] = C[i];
  13. }

  14. // 打印
  15. void show(int* A) {
  16.         int flag = 0;
  17.         for (int i = 0; i < N; i++) {
  18.                 if (A[i]) flag = 1;
  19.                 if (flag) printf("%d", A[i]);
  20.         }
  21. }

  22. int main() {
  23.         int
  24.                 A[N] = { 0, 0, 3, 5, 4 }, // A = 354
  25.                 B[N] = { 0, 0, 0, 2, 4 }; // B = 24

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

  28.         return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 13:38:47 | 显示全部楼层
本帖最后由 ba21 于 2022-4-17 13:43 编辑
Boring1031 发表于 2022-4-17 11:10
这个算不了50那么大的呀


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

  4. int Max(int a,int b)
  5. {
  6.         return a > b ? a : b;
  7. }

  8. // 大数相加
  9. char* AddBigNumber(char *s, char *p)
  10. {
  11.         int x = 0;
  12.         int len1 = strlen(s);         /*  获得字符串长度  */
  13.         int len2 = strlen(p);
  14.         int len3 = Max(len1--, len2--) + 1;      /*  结果的长度最大应为较长字符串长度+1  */
  15.         char *arr;
  16.         arr = (char*)malloc(sizeof(char)*(len3+1));
  17.       /*  为结果申请存储空间,+1是因为末尾有一个'\0'  */
  18.         arr = &arr[len3];       /*  因为是从末尾开始相加,所以指针跳转到末尾  */
  19.         *arr = '\0';
  20.         while(len1 >= 0 || len2 >= 0)  /*  当两个字符串都走完了才结束  */
  21.         {
  22.                 if(len1 >= 0)
  23.                         x += s[len1--] - '0';
  24.                 if(len2 >= 0)
  25.                         x += p[len2--] - '0';
  26.                 *(--arr) = (x % 10) + '0';       /*  将结果对10取余赋给arr  */
  27.                 x /= 10;              /*  重置为上一次运算的进位  */
  28.         }
  29.         if(x == 1)           /*  如果循环完后还有进位  */
  30.                 *(--arr) = '1';
  31.         return arr;
  32. }

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

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

  42.     arr[len3] = '\0';

  43.     arr = &arr[len3];
  44.     len1--;
  45.     len2--;
  46.     i = x = 0;

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

  56.         *(--arr) = x % 10 + '0';
  57.         x /= 10;
  58.         i++;
  59.     }

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

  62.     return --arr;
  63. }

  64. char *factorial(int n)
  65. {
  66.     int i;
  67.     char *product;
  68.     char buf[1024];

  69.     product=NULL;
  70.     for(i=n; i>0; i--)
  71.     {
  72.         if(product==NULL)
  73.         {
  74.             product = MultipyBigNumber("1", itoa(i, buf, 10));
  75.             continue;
  76.         }
  77.         product = MultipyBigNumber(product, itoa(i, buf, 10));
  78.     }

  79.     return product;
  80. }

  81. int main(void)
  82. {
  83.     int i, n;
  84.     char buf[1024];
  85.     char *sum;

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

  88.     sum=NULL;
  89.     for(i=n; i>0; i--)
  90.     {
  91.         if(sum==NULL)
  92.         {
  93.             sum = AddBigNumber("0", factorial(i));
  94.             continue;
  95.         }
  96.         sum = AddBigNumber(sum, factorial(i));
  97.     }

  98.     printf("结果%s\n", sum);
  99. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 17:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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