c语言高精度算法阶乘_【自学C语言】书笔记 02 算法

56293a670b4b42f478ecee439c3e5d10.png

一、前言

    什么是计算机程序?计算机程序与算法是什么样的关系?

    有人这样给计算机程序进行定义:

        计算机程序是一个指令的集合;

        计算机程序是一个问题的解决方案;

        计算机程序是一个产品;

        计算机程序是数据结构加算法。

    从程序内部组成来说,计算机程序是一个指令集合。

    编写程序的过程是写指令集的过程,它能过告诉计算机怎样实现特定的功能。

    而指令集是用计算机能够理解的语言编写的,因为计算机无法读懂人类的语言。

    计算机程序是一个问题的解决方案,主要包括:找出问题,理解问题,找出解决问题的备选方案,找出最佳方案,使用选择的方案,列出帮助解决问题的指令,评估解决方案多个步骤。

    例:

    求1+2+3+……+10的和的解决方案如下。

    1)找出问题:

        求1~10的和。

    2)理解问题:

        求1~10的自然数的和。

    3)列出备选方案。

        备选一:

            将各项依次相加求和。

        备选二:

            凑10法求和。

        备选三:

            等差数列求和。

        备选四:

            逆序求和。

    4)选择最佳方案。

        备选一:

            适合计算机运算,寻找规律,不难发现可以采用循环累加的办法,而且每次的加数都比前一个数多一。

        备选二:

            适合口算,如果求1~10000自然数的和,这种算法就不太适合了。存在着一定的局限性。

        备选三:

            不符合人们的运算规律。

        所以,备选一为最佳方案。

    5)C语言代码(指令)如下:

#includevoid main() {
      int i, s = 0;  for (i = 1; i <= 10; i++) {
        s += i;  }  printf("s=%d\n", s);}

分析:

    首先是载入头文件。

    然后是主函数。

    先定义一个变量i,用于循环计数;再定义一个变量s,用于保存相加的结果。

    然后通过for循环进行重复相加。

    最后通过输出语句进行输出。

运行结果:

ab6f973648402ae7a67632fea01f688a.png

    6)评估方案

        通过运行程序,发现该方案具有通用性。

        如果求200~500的和,只需要将for (i = 1; i <= 10; i++)改成for (i = 200; i <= 500; i++)即可。

        计算机程序包括对数据的描述和对操作的描述。

        前者为数据结构,包括数据类型与数据的组织形式;后者为算法,即操作步骤,主要解决“做什么”和“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,由于整数类型有一定的大小限制,直接计算大整数的阶乘可能会导致溢出。为了处理高精度计算,特别是在计算较大数值的阶乘时,通常会使用一些特殊的数据结构和算法,比如动态数组(数组或链表)来存储中间结果,并利用迭代或者递归的方式逐步计算。 以下是一个简单的高精度阶乘计算方法(利用数组存储大整数)的示例: ```c #include <stdio.h> #include <stdlib.h> // 定义一个结构体来表示大整数 typedef struct { int* digits; // 数组存储每个位 int size; // 数组长度 } bigint; // 初始化大整数为0 bigint init_zero() { bigint zero; zero.digits = malloc(sizeof(int)); zero.digits = 0; zero.size = 1; return zero; } // 添加两个大整数 bigint add(bigint a, bigint b) { if (a.size == 0) return b; if (b.size == 0) return a; int carry = 0, i, j, new_size; bigint result = init_zero(); for (i = a.size - 1, j = b.size - 1; i >= 0 || j >= 0; --i, --j) { int sum = a.digits[i] + b.digits[j] + carry; result.digits[result.size++] = sum % 10; carry = sum / 10; } if (carry > 0) result.digits[result.size++] = carry; return result; } // 计算阶乘 bigint factorial(bigint n) { bigint fact = init_zero(), temp = n; while (temp.digits != 0) { fact = add(fact, temp); temp.digits[temp.size - 1]--; if (temp.digits[temp.size - 1] == 0) temp.size--; } return fact; } int main() { bigint num; printf("请输入一个整数: "); scanf("%d", &num.digits); num.size = 1; num = factorial(num); for (int i = num.size - 1; i >= 0; --i) { printf("%d", num.digits[i]); if (i != 0) printf(","); } return 0; } ``` 请注意,这个例子没有处理负数和溢出问题,实际应用中可能需要额外检查。此外,如果频繁进行高精度计算,可能要考虑使用专门的库如GMP(GNU Multiple Precision Arithmetic Library)来提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值