广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 尚未审核订阅工具 订阅

    基础练习 阶乘计算

    来源:网络收集  点击:  时间:2024-07-20
    【导读】:
    问题描述输入一个正整数n,输出n!的值。其中n!=1*2*3*…*n。算法描述n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A表示a的个位,A表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。输入格式输入包含一个正整数n,n=1000。输出格式输出n!的准确值。样例输入10样例输出3628800工具/原料moreDev-c++方法/步骤1/6分步阅读

    我把阶乘的结果放到了一个数组里,数组大小为3000,用max表示,memset函数将数组a的每一位都初始化为0,然后令a=1

    2/6

    i代表乘数,j代表数的每一位,乘数i从2开始增加到n,因为乘1积不变;j从0开始增加到max,因为数有几位是未知的,s为数的某一位乘以乘数再加上进位的值,比如24*5,s就是4*5+0=20(这是还没有进位,即为0),然后计算进位,为2,个位为0,再进入循环,s为2*5+2=12(带上前面的进位2),计算进位为1,十位为2,再循环,s为0*5+1=1(这里的0是数组初始化的,计算到最高位后都是0了),计算进位为0,百位为1,一直循环下去都是0了,不会改变的,最后得到结果就是120.

    3/6

    从数组的最后开始倒着查找我们计算的结果的最高位在哪里,如果出现最高位(肯定是非零的),就退出

    4/6

    找到了最高位,就从最高位输出,全部输出完后,得到的就是我们计算的结果。

    5/6

    附上完整代码:

    #includeiostream

    #includestring.h

    #define max 3000

    using namespace std;

    int main(){

    int c=0;//进位

    int i,j,a,n,s;

    memset(a,0,sizeof(a));//将数组全部初始化为0,该函数在string.h头文件中

    a=1;

    cinn;

    for(i=2;i=n;i++){//乘数

    for(j=0;jmax;j++){//个位,十位,百位~~~

    s=a*i+c;//每位乘以i并加上进位

    c=s/10;//进位为积除以10的商

    a=s%10;//更新进位后的每一位的值

    }

    }

    for(i=max-1;i=0;i--){//从数组最末尾开始查找阶乘的最高位(非零的)

    if(a)

    break;

    }

    for(j=i;j=0;j--){//从阶乘最高位开始输出

    couta;

    }

    return 0;

    }

    6/6

    代码通过,计算1000的阶乘也完全不虚。

    注意事项

    如果我的经验对你有一点点帮助,希望你能为我投上一票,你的肯定是我创作的动力。

    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.ff371.cn/art_974247.html

    相关资讯

    ©2019-2020 http://www.ff371.cn/ 国ICP备20009186号05-23 09:25:18  耗时:0.742