美文网首页
【C/C++】1~20的阶乘之和

【C/C++】1~20的阶乘之和

作者: 胡同口的蛙 | 来源:发表于2018-10-01 11:24 被阅读100次

    一. 前情

      能点进这篇文章的,想必也已经知道了C语言和C++语言,以及阶乘的定义,所以在此不赘述了。SUM(1!~20!)这个问题是我在大一学C语言时的一个小题,最近又要把编译器装回来,所以装完之后顺便用这个问题白话白话。
      逻辑方面并不难,但主要是溢出的问题,即这个数太大了,用 int 整型变量根本装不下,相当于让你用一张小纸条记圆周率的小数点后100w位的数字,小纸条太小,装不下那么多字。要解决这个问题,你可以选择:1. 找一张很大的大纸条。2. 找好多张小纸条拼起来。 本文用的前者(后者可自行百度“多位整数 大整数 运算”)。
    环境:Win7系统。Dev-C++编译器。C++语言。

    二. 具体

    代码:

    #include<iostream>
    using namespace std;
    int main()
    {
        int i=1;
        __int64 m=0,j=1;
        cout<<"SUM(1!~20!)"<<endl<<"=0";
        for(i;i<21;i++)
        {
            j*=i;
            m+=j;
            cout<<"+"<<j;
        }
        cout<<endl<<"="<<m<<endl;
        return 0;
    }
    

    输出结果:

    结果为 2561327494111820213

    三. 后续

      __int64可用long long代替。另外C++ 中的cincout函数相当于C语言中的scanfprintf函数,C语言使用者可自行理解。
      一开始用 int 整型变量时,在没让程序 printf 出每个数的阶乘得数的情况下,求出结果是 268040729,可通过部分信息证伪,正确结果:

    1. 肯定以“3”结尾,即个位数字为3。
    2. 肯定是3的倍数。
    3. 至少是17位数(实际是19位)。

    以上三点自行理解,理解不了就问,但我回答完之后可能会加上:
      所以说学编程啊,还是要提高自己的计算与逻辑能力。

    参考资料:
    http://www.cnitblog.com/cockerel/archive/2006/08/16/15356.html

    相关文章

      网友评论

          本文标题:【C/C++】1~20的阶乘之和

          本文链接:https://www.haomeiwen.com/subject/hlzgoftx.html