打印一個整數的每一位和求階乘(遞歸和非遞歸的C語言實現)

文章目錄

  • 打印一個整數的每一位
    • 思考
    • 遞歸
    • 非遞歸
  • 求階乘
    • 遞歸
    • 非遞歸
    • 證明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:

  1. 基本情況: 當n = 0時,我們需要證明0! = 1,這是基本情況。
  2. 歸納假設: 假設對于某個非負整數 k,k! 等于1成立,即假設歸納假設為真。
  3. 歸納步驟: 現在我們要證明(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),因此正在回退到完整的編譯過程。

  1. IPDB 是一個包含信息的文件,通過存儲先前編譯的數據,加速了編譯過程。當找不到現有的 IPDB時,編譯器會回到完整的編譯過程,這可能需要更多時間。
  2. 這個消息通常出現在開發環境中,不一定表示錯誤。這更多是在構建過程中的信息性消息。如果在編譯過程中遇到任何問題或錯誤,你可能需要檢查你的構建配置。
  3. 這個 Visual Studio 輸出窗口的信息表明,所有8個函數都被重新編譯,因為在先前的編譯中找不到可用的IPDB(Incremental Program Database)或 IOBJ(Intermediate Object)。
  4. 增量編譯是一種優化,它只重新編譯發生更改的部分,而不是整個程序。IPDB 文件包含了先前編譯的信息,可以幫助加速這個過程。IOBJ文件包含中間對象代碼。
  5. 在這種情況下,由于找不到可用的 IPDB 或 IOBJ,編譯器不得不重新編譯所有8個函數,這可能導致編譯時間較長。通常情況下,這并不是一個錯誤,而是一個提示,告訴我們編譯過程中的一些細節。
  6. 如果希望加快編譯速度,可以檢查項目設置,確保啟用了適當的編譯優化和增量編譯選項。此外,確保先前的編譯輸出和中間文件沒有被刪除或移動,以供下一次編譯使用。

為什么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:使用非標準的擴展可能導致代碼在不同的編譯器或平臺上不可移植。如果需要處理非常大的整數,了解所使用編譯器和平臺的支持情況,并選擇合適的庫或方案是很重要的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DevEco Studio將編輯器整體文本改為簡體中文

我們打開編輯器 隨便進入一個項目 這里 我們左上角目錄 選擇 File下面菜單中的 Settings… 打開配置界面 然后在設置窗口左側導航欄中 選擇 Plugins 插件 然后上方導航欄中 選擇 Installed 參考下圖 然后 找到這個Chinese(Simplified) Chinese是什么應該不用我多說吧 我們把…

區塊鏈擴容問題研究【06】

1.Plasma&#xff1a;Plasma 是一種基于以太坊區塊鏈的 Layer2 擴容方案&#xff0c;它通過建立一個分層結構的區塊鏈網絡&#xff0c;將大量的交易放到子鏈上進行處理&#xff0c;從而提高了以太坊的吞吐量。Plasma 還可以通過智能合約實現跨鏈交易&#xff0c;使得不同的區塊…

Python面經【8】- Python設計模式專題-上卷

Python面經【8】- Python設計模式專題-上卷 一、接口二、單例模式(1) 方法一&#xff1a;使用模塊(2) 方法二&#xff1a; 裝飾器實現【手撕 理解】&#xff08;單下劃線 閉包 裝飾器 類方法&#xff09;(3) 方法三&#xff1a;基于__new__方法【new和init 】 設計模式是一…

簡單的 u-popup 彈出框

uniapp中的popup組件可以用于彈出簡單的提示框、操作框、菜單等。它可以通過position屬性控制彈出框的位置&#xff0c;不同的position值會使得彈出框呈現不同的彈出形式 目錄 一、實現思路 二、實現步驟 ①view部分展示 ②JavaScript 內容 ③css中樣式展示 三、效果展示 …

Linux系統---基于Pipe實現一個簡單Client-Server system

顧得泉&#xff1a;個人主頁 個人專欄&#xff1a;《Linux操作系統》 《C/C》 《LeedCode刷題》 鍵盤敲爛&#xff0c;年薪百萬&#xff01; 一、題目要求 Server是一個服務器進程&#xff0c;只能進行整數平方運算。Client要計算一個整數的平方的平方的平方&#xff0c;即…

聊聊 Jetpack Compose 原理 -- 穿透刺客 CompositionLocal

Compose 官方說明一直很簡潔&#xff1a;CompositionLocal 是通過組合隱式向下傳遞數據的工具。 我們先來看一段代碼&#xff1a; class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setCo…

datav-輪播排名-對數據進行處理

前言 對于大屏需求我們排名數據輪播也是經常需要用到的需求&#xff0c;datav也是給我們提供了 不是說我們自己不能寫&#xff0c;而是提供好的輪子比我們自己 寫的&#xff0c;更全面&#xff0c;更周到&#xff0c; 沒有特殊需求的話&#xff0c;使用datav配置一下完成這個…

mysqlsh導入json,最終還得靠navicat導入json

工作需要將一個巨大的10G的json導入mysql數據庫。 看到mysql官方有對json導入的支持。 如下&#xff1a; MySQL :: Import JSON to MySQL made easy with the MySQL Shell $ mysqlsh rootlocalhost:33300/test --import /path_to_file/zips.json Creating a session to root…

產品經理進階:以客戶為中心的8個維度

目錄 簡介 以客戶為中心 流程和組織維度 產品維度 CSDN學院《硬件產品進階課》

python:六種算法(DBO、RFO、WOA、GWO、PSO、GA)求解23個測試函數(python代碼)

一、六種算法簡介 1、蜣螂優化算法DBO 2、紅狐優化算法RFO 3、鯨魚優化算法WOA 4、灰狼優化算法GWO 5、粒子群優化算法PSO 6、遺傳算法GA 二、6種算法求解23個函數 &#xff08;1&#xff09;23個函數簡介 參考文獻&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…

讀書筆記 | 自我管理的關鍵是提高執行力

哈嘍啊&#xff0c;你好&#xff0c;我是雷工&#xff01; 有句話說&#xff0c;能管好自己才是真的本事。 自我管理&#xff0c;管好自己很重要。 我們之所以懂得這么多的道理&#xff0c;卻依然過不好這一生&#xff1f; 很大部分原因是因為管不住自己&#xff0c;做不到。 …

性能測試基礎

性能測試分類 客戶端性能&#xff1a;測試APP自身的性能&#xff0c;例如CPU、內存消耗&#xff1b;web頁面元素渲染速度 服務端性能&#xff1a;測試服務端項目程序的支持的并發、處理能力、響應時間等&#xff0c;主要通過接口來做性能測試 性能測試指標 并發 同時向服務…

大一作業習題

第一題&#xff1a;答案&#xff1a; #include <stdio.h> void sort(int a[], int m) //將數組a的前m個元素(從小到大)排序 {int i 0;for (i 0; i < m - 1; i){int j 0;int flag 1;for (j 0; j < m - 1 - i; j){if (a[j] > a[j 1]){int t 0;t a[j];…

Java八股文面試全套真題【含答案】- Servlet篇

以下是一些關于Servlet的經典面試題以及它們的答案&#xff1a; 什么是 Servlet&#xff1f; 答案&#xff1a;Servlet 是運行在服務器上&#xff0c;用于處理客戶端請求并生成響應的 Java 類。 Servlet 和 JSP 之間的區別是什么&#xff1f; 答案&#xff1a;Servlet 是基于…

1.鴻蒙應用程序開發app_hap開發環境搭建

1.下載Node.js, Javascipts的運行環境 node.js版本下載v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下載并安裝DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的應用及服務開發&#xff0c;提供了代碼智能編輯、低代…

Docker筆記:Docker中簡單配置Mysql/Redis/Mongodb容器

Docker 配置 Mysql 容器 1 &#xff09;方案1&#xff1a;基于centos等linux操作系統 啟動centos鏡像&#xff0c;在里面安裝 mysql這樣比較麻煩&#xff0c;配置的東西很多 … 2 &#xff09;方案2&#xff1a;直接用 mysql 鏡像 (推薦) $ docker pull mysql 下載鏡像$ do…

589. N 叉樹的前序遍歷

589. N 叉樹的前序遍歷 java1&#xff1a;stack棧&#xff1a;沒看懂 class Solution {public List<Integer> preorder(Node root) {List<Integer> res new ArrayList<Integer>();if (root null) {return res;}Map<Node, Integer> map new HashMa…

C盤瘦身,C盤清理

以下只是我的C盤清理經驗~ 一.【用軟件簡單清理C盤】 使用一些垃圾清理軟件&#xff0c;簡單的初步把C盤先清理一遍。&#xff08;這種軟件太多我就不推薦了……&#xff09; 二.【WPS清理大師】 因為我電腦裝了WPS&#xff0c;發現右鍵單擊C盤有個選項【釋放C盤空間】&#xf…

接口自動化框架(Pytest+request+Allure)

前言&#xff1a; 接口自動化是指模擬程序接口層面的自動化&#xff0c;由于接口不易變更&#xff0c;維護成本更小&#xff0c;所以深受各大公司的喜愛。 接口自動化包含2個部分&#xff0c;功能性的接口自動化測試和并發接口自動化測試。 本次文章著重介紹第一種&#xff0c…

Vue3.3.4中watch無法監測props的更改

背景 網上說了很多解決方案&#xff0c;都是通過watch(() > props.value, (newValue, oldValue) > {})解決&#xff0c;或者是加上{deep: true}附加屬性。但是我在Vue3.3.4中&#xff0c;還是無法解決。 下面說一下我的解決方案。 解決方案 通過父組件調用子組件defineE…