计算阶乘ñ!

主题: 编写一个程序,计算出n! với n là số tự nhiên không âm nhập vào từ bàn phím

Để làm được bài này, 首先,你需要记得式N! 有. 根据定义,我们有阶乘:

  • 0! = 1
  • ñ! = 1.2.3…ñ

Vậy là ta có công thức rồi. 看着我们用正看到公式= 0 这很容易, 如果n> 0 thì nó là tích các số từ 1 到n. Vậy chúng ta có thể dùng để tính dễ dàng 🙂

/*
* Calculate n!
*/

#include <stdio.h>

int main()
{
	int i, n;
	int fact = 1;

	printf("Enter n = ");
	scanf("%d", &n);

	for(i = 1; i <= n; i++) 
	{
		fact = fact * i;
	}

	printf("%d! = %d\n", n, fact);

	return 0;
}

Khá dễ dàng. Tuy nhiên các bạn để ý một chút kẻo nhầm.

  • Tại sao chúng ta lại gán giá trị ban đầu cho biến fact (Factorial) 是 1 这不是 0 hoặc số khác? Đơn giản vì nếu gán fact = 0 thì fact luôn là 0 的 0 乘以数目是 0.
  • 我们为什么不检查代码的情况下,N = 0 ? 因为在我们的循环变量i从运行 1 到n. 如果n = 0 然后当然的循环将不会运行一次,然后我们的事实仍然 1. 因此,该程序仍然是正确的

返回考虑小NHE. 您尝试输入n是 20 或大于看看会发生什么? 您将看到结果是错误的或者返回一个负数是. 之所以? 您注意,由于人类连续阶乘的性质,以便其结果会增加非常快. 5! = 120 但 6! = 720 走了. 因此,我们的事实将快速增长使数据类型 (INT) 我们是无法遏制 (你可以看到 数据类型的有限范围). 因此,我们需要改变的数据类型. ñ根据其中我们估计,我们使用的数据类型的大小是什么类型. 您可以使用 很长很长 对于所有的阶乘NHE.

/*
* Calculate n!
*/

#include <stdio.h>

int main()
{
	int i, n;
	long long fact = 1;

	printf("Enter n = ");
	scanf("%d", &n);

	for(i = 1; i <= n; i++) 
	{
		fact = fact * i;
	}

	printf("%d! = %lld\n", n, fact); // lld for long long

	return 0;
}

如果以此推算, 20!. 而下面的结果:

Enter n = 20
20! = 2432902008176640000

20! 有一些非常大的.

编写一个程序,计算出n! 通过递归. 对于非负整数n从键盘输入

除了使用环出, 我们可以使用递归函数与大自然来计算阶乘. 你有没有注意到公式为我们的阶乘.

  • 0! = 1
  • ñ! = 1.2.3…N = N。(N-1).(N-2)…2.1 = N。(N-1)!

指N! = N。(N-1)!. 在阶乘定义有阶乘, 它相当于递归 – 记得函数的主要功能. 我们可以写出如下程序:

/*
* Calculate n! by recursive
*/

#include <stdio.h>

long long fact(int n) 
{
	if(n == 0) return 1;
	return n * fact(n-1);
}

int main()
{
	int n;

	printf("Enter n = ");
	scanf("%d", &n);

	printf("%d! = %lld\n", n, fact(n));

	return 0;
}

您可以参考这里约 使用功能和递归函数.

锻炼: 编写显示程序 1!, 2!, 3!,…, 20! 同时. 每行显示一些.