文章目錄
- 打印一個整數的每一位
- 思考
- 遞歸
- 非遞歸
- 求階乘
- 遞歸
- 非遞歸
- 證明0的階乘為1
- 寫代碼中遇到的VS輸出窗口提示信息
- 為什么VS平臺32位和64位的long都是4字節?
- %zu是什么格式說明符
- VS下_int128為什么用不了
打印一個整數的每一位
思考
負數和0都是整數,我們該如何處理輸入的整數是負數和0的情況呢?是在函數里面處理還是在主調函數中處理呢?
遞歸
void printDigits(int n)//遞歸方式實現打印一個整數的每一位(主調函數處理0和負整數的情況)
{if (n == 0)return;//Base caseprintDigits(n / 10);//Recursive caseprintf("%d\n", n % 10);//Print the last digit
}
非遞歸
void print_digits(int n)//非遞歸方式實現打印一個整數的每一位(可以在函數中處理也可以在主調函數處理)
{int length = 0;//記錄整數的總位數while (n > 0){length++;n /= 10;}for (; length > 0; length--){printf("%d\n", n % 10);}
}
求階乘
遞歸
//實測VS下int和long能表示的最大階乘是16!long long是25!_int64(打印的時候用格式化說明符%zu)是65!_int128用不了
int Factorial(int n)//遞歸實現求n的階乘(不考慮溢出的問題)
{if (n < 0)return 0;//輸入非法,階乘未定義負數if (n == 0 || n == 1)return 1;//Base caseelse return n * Factorial(n - 1);//Recursive case
}
非遞歸
int factorial(int n)//非遞歸實現求n的階乘(不考慮溢出的問題)
{if (n < 0)return 0;//輸入非法,階乘未定義負數int result = 1;while (n > 1)result *= n--;return result;
}
證明0的階乘為1
證明0!等于1可以從數學的角度進行推導。一種常見的方法是通過歸納法。
歸納法證明0!等于1:
- 基本情況: 當n = 0時,我們需要證明0! = 1,這是基本情況。
- 歸納假設: 假設對于某個非負整數 k,k! 等于1成立,即假設歸納假設為真。
- 歸納步驟: 現在我們要證明(k + 1)!等于1。根據階乘的定義:
(k + 1)! = (k + 1)*k!
利用歸納假設,我們知道k!等于1。代入這個結果:
(k+1)!=(k+1)*1=k+1
因此,我們證明了當k為非負整數時,(k+1)!等于k+1。
結合基本情況和歸納步驟,我們得出結論:對于所有非負整數,n!等于1。這也包括了n=0的情況,因此0!等于1。
寫代碼中遇到的VS輸出窗口提示信息
環境:VS2022,release
提示信息:
Previous IPDB not found,fall back to full compilation
All 8 functions were compiled because no usable IPDB/IOBJ from previous compilation was found
“Previous IPDB not found, fall back to full compilation” 這個消息表明系統無法找到先前生成的增量程序數據庫(IPDB),因此正在回退到完整的編譯過程。
- IPDB 是一個包含信息的文件,通過存儲先前編譯的數據,加速了編譯過程。當找不到現有的 IPDB時,編譯器會回到完整的編譯過程,這可能需要更多時間。
- 這個消息通常出現在開發環境中,不一定表示錯誤。這更多是在構建過程中的信息性消息。如果在編譯過程中遇到任何問題或錯誤,你可能需要檢查你的構建配置。
- 這個 Visual Studio 輸出窗口的信息表明,所有8個函數都被重新編譯,因為在先前的編譯中找不到可用的IPDB(Incremental Program Database)或 IOBJ(Intermediate Object)。
- 增量編譯是一種優化,它只重新編譯發生更改的部分,而不是整個程序。IPDB 文件包含了先前編譯的信息,可以幫助加速這個過程。IOBJ文件包含中間對象代碼。
- 在這種情況下,由于找不到可用的 IPDB 或 IOBJ,編譯器不得不重新編譯所有8個函數,這可能導致編譯時間較長。通常情況下,這并不是一個錯誤,而是一個提示,告訴我們編譯過程中的一些細節。
- 如果希望加快編譯速度,可以檢查項目設置,確保啟用了適當的編譯優化和增量編譯選項。此外,確保先前的編譯輸出和中間文件沒有被刪除或移動,以供下一次編譯使用。
為什么VS平臺32位和64位的long都是4字節?
Visual Studio 編譯器在 Windows 平臺上,無論是32位還是64位,都將long
類型定義為4字節。這是由于歷史原因和與 Windows API 的兼容性考慮。
在 Windows API 中,long
類型通常被定義為4字節,即使在64位系統上也是如此。這是為了確保32位和64位程序之間的二進制兼容性,因為許多Windows API函數在參數和數據結構中使用了 long
類型。
%zu是什么格式說明符
%zu
是 C 語言中用于格式化輸出的格式說明符之一。在 printf
函數中,%zu
用于輸出 size_t
類型的值。
%z
表示以大小為參數的長度修飾符。u
表示無符號整數。
size_t
是無符號整數類型,通常用于表示內存塊的大小、數組的索引等。使用 %zu
保證在不同平臺上都能正確地輸出 size_t
類型的值,因為 size_t
的大小可能在不同系統上有所變化。
VS下_int128為什么用不了
在 C 和 C++ 中,_int128
通常不是標準的整數類型。這可能導致在某些編譯器或平臺上無法直接使用 _int128
。而在一些特定的編譯器中,如 GCC,可以使用 __int128
來表示128位整數。
如果在使用 _int128
或 __int128
遇到問題,可能是因為編譯器不支持或不提供這個類型。在這種情況下,可能需要考慮使用特定于你的編譯器的擴展或其他庫,或者考慮使用更通用的庫,如 GMP(GNU Multiple Precision Arithmetic Library),它提供了對大整數操作的支持。
PS:使用非標準的擴展可能導致代碼在不同的編譯器或平臺上不可移植。如果需要處理非常大的整數,了解所使用編譯器和平臺的支持情況,并選擇合適的庫或方案是很重要的。