负数和0都是整数,我们该如何处理输入的整数是负数和0的情况呢?是在函数里面处理还是在主调函数中处理呢?
void printDigits(int n)//递归方式实现打印一个整数的每一位(主调函数处理0和负整数的情况)
{
if (n == 0)return;//Base case
printDigits(n / 10);//Recursive case
printf("%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 case
else 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:
结合基本情况和归纳步骤,我们得出结论:对于所有非负整数,n!等于1。这也包括了n=0的情况,因此0!等于1。
环境: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),因此正在回退到完整的编译过程。
Visual Studio 编译器在 Windows 平台上,无论是32位还是64位,都将long
类型定义为4字节。这是由于历史原因和与 Windows API 的兼容性考虑。
在 Windows API 中,long
类型通常被定义为4字节,即使在64位系统上也是如此。这是为了确保32位和64位程序之间的二进制兼容性,因为许多Windows API函数在参数和数据结构中使用了 long
类型。
%zu
是 C 语言中用于格式化输出的格式说明符之一。在 printf
函数中,%zu
用于输出 size_t
类型的值。
%z
表示以大小为参数的长度修饰符。u
表示无符号整数。size_t
是无符号整数类型,通常用于表示内存块的大小、数组的索引等。使用 %zu
保证在不同平台上都能正确地输出 size_t
类型的值,因为 size_t
的大小可能在不同系统上有所变化。
在 C 和 C++ 中,_int128
通常不是标准的整数类型。这可能导致在某些编译器或平台上无法直接使用 _int128
。而在一些特定的编译器中,如 GCC,可以使用 __int128
来表示128位整数。
如果在使用 _int128
或 __int128
遇到问题,可能是因为编译器不支持或不提供这个类型。在这种情况下,可能需要考虑使用特定于你的编译器的扩展或其他库,或者考虑使用更通用的库,如 GMP(GNU Multiple Precision Arithmetic Library),它提供了对大整数操作的支持。
PS:使用非标准的扩展可能导致代码在不同的编译器或平台上不可移植。如果需要处理非常大的整数,了解所使用编译器和平台的支持情况,并选择合适的库或方案是很重要的。