新手专科准大一学习c语言的第4天之用for循完成一个数的阶乘

阶乘算法的展示

今天在学习for循环里学习了一个简单的算法如下

#include <stdio.h>

int main()
{
    // 先简单定义几个变量
    int a = 0;
    int b = 0;
    int ret = 1;// 定义一个变量来存储阶乘的值 要使阶乘有意义ret初始值必须为非0
    scanf("%d", &b);// 用scanf来从输入中获取b的值
    for (a = 1; a <= b; a++) // 定义一个循环为保证阶乘有意义我们把a从新赋值a=1并且给了条件和调整更新a的操作
    { // 因为阶乘的操作原理是给定一个数a=1*2*3*4*....a*然后输出最终值
        ret = ret * a;// 当b=1时ret=1*1=1 存储起来 当b=2时利用上次循环ret的值为1来计算这次ret的最终值并存储起来ret=1*2=2 当b=3时利用前一次循环存储ret的值来计算这次ret的最终值为ret=2*3=6 以此类推就可以
    }
    printf("%d", ret);
    return 0;
}

原理

具体来说,它实现了一个阶乘算法

a 用于循环中的计数。

b 是用户输入的目标数字。

ret 用于存储阶乘的结果,初始值为1,因为乘法的单位元是1。

使用 for 循环从 1b,依次将 a 的值乘到 ret 上。

每次循环都会将 a 的当前值乘到 ret,更新 ret 的值。

最后,输出计算得到的 ret 值,即 b! 的结果。

代码实现了计算一个整数的阶乘的功能。阶乘(通常表示为n!)是所有从1n的整数的乘积。比如:

3! = 1 × 2 × 3 = 6

5! = 1 × 2 × 3 × 4 × 5 = 120

问题

当我尝试较大(输入13以上)的数进行阶乘的时候会发生一些问题会导致计算不准确个人也查阅了一些资料发现是一个叫“整数溢出”的问题,因此,如果b的值较大(比如超过12),计算出来的阶乘结果可能会超出int类型能表示的范围,导致溢出。这意味着计算得到的结果不再是正确的阶乘值,而是一个无效或负数。

解决方案

查阅资料后也得出了一些解决办法比如为了计算更大的阶乘,可以选择更大的数据类型,比如long longunsigned long long

#include <stdio.h>

int main() {
    int a = 0;
    int b = 0;
    long long ret = 1;  // 使用long long类型来存储更大的阶乘结果
    scanf("%d", &b);
    for (a = 1; a <= b; a++) {
        ret = ret * a;
    }
    printf("%lld", ret);  // 使用%lld来打印long long类型的值
    return 0;
}

缺陷

但是即使使用这些类型,当b进一步增大时,仍然可能会遇到溢出问题。对于更大范围的数字,可以考虑使用大数库(如GMP库)来处理。当然目前还只是处于新手小白菜鸟阶段这些到日后再涉足吧

总结

这个程序使用了循环结构来实现阶乘计算,这就是一个简单的算法。虽然它非常基础,它明确描述了如何从输入值 b 得到输出值 b!,并且每一步都清晰地定义了操作步骤。

但是由于int类型的范围限制,如果输入较大的b值,计算的阶乘结果会超出int的表示范围,导致溢出和错误结果。可以通过使用更大范围的数据类型或者专门的大数库来解决这个问题。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值