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


一. 前情

  能點進這篇文章的,想必也已經知道了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;
}

輸出結果:
結果為 2561327494111820313

三. 后續

  __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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM