打印一个整数的每一位和求阶乘(递归和非递归的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.mzph.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…