C#计算阶乘程序改进
// 引入所需的命名空间
using System; // 提供基本输入输出(如 Console)
using System.Collections.Generic; // 暂未使用,可删除(用于集合类如 List<T>)
using System.Linq; // 暂未使用,可删除(用于 LINQ 查询)
using System.Text; // 暂未使用,可删除(用于文本处理)
using System.Threading.Tasks; // 暂未使用,可删除(用于多线程任务)// 定义一个名为 "jiecheng" 的命名空间,用于组织代码
namespace jiecheng
{// 定义一个类,名为 jiecheng(用于计算阶乘)class jiecheng{// 定义一个公共方法 Jc,接收一个整数 num,返回其阶乘(int 类型)public int Jc(int num){// 使用三元运算符实现递归:// 如果 num > 0,则返回 num * Jc(num - 1) —— 即:n! = n × (n-1)!// 否则(num <= 0),返回 1 —— 阶乘定义中 0! = 1,且防止无限递归return num > 0 ? num * Jc(num - 1) : 1;}}// 定义另一个类,用于执行阶乘计算(包含程序入口)class excutejiecheng{// 程序的主入口方法,程序从这里开始运行static void Main(string[] args){// 创建 jiecheng 类的一个实例(对象),命名为 njiecheng n = new jiecheng();// 从控制台读取用户输入的一行文本,转换成 16 位整数(Int16)// 然后调用 n 对象的 Jc 方法计算阶乘,结果存入 resultint result = n.Jc(Convert.ToInt16(Console.ReadLine()));// 将计算结果输出到控制台,格式化为 "result is [结果]"Console.WriteLine("result is {0}", result);// 暂停程序,等待用户按任意键继续(防止控制台窗口一闪而过)Console.ReadKey();}}
}
🔍 代码整体说明:
✅ 功能:
- 这是一个计算阶乘的简单控制台程序。
- 用户输入一个整数(如
5
),程序输出它的阶乘(如120
)。
✅ 阶乘定义:
n! = n × (n-1) × (n-2) × ... × 1
- 特别地:
0! = 1
✅ 示例运行:
输入:5
输出:result is 120
✅ 递归原理:
Jc(5)
→5 * Jc(4)
Jc(4)
→4 * Jc(3)
- …
Jc(1)
→1 * Jc(0)
Jc(0)
→1
(递归终止)- 最终:
5 * 4 * 3 * 2 * 1 * 1 = 120
⚠️ 注意事项(潜在问题):
-
输入范围限制:
Convert.ToInt16()
只能处理 -32768 到 32767 的整数。- 阶乘增长极快,超过 12! 就会超过 int 范围,导致溢出(结果错误)。
- 建议改用
long
或BigInteger
(需引入System.Numerics
)处理大数。
-
未处理非法输入:
- 如果用户输入非数字(如
abc
),程序会抛出异常崩溃。 - 建议使用
int.TryParse()
来安全读取输入。
- 如果用户输入非数字(如
-
命名建议:
- 类名建议使用 PascalCase,如
JieCheng
、ExecuteJieCheng
。 - 方法名也应为
CalculateFactorial
等更清晰的命名。
- 类名建议使用 PascalCase,如
✅ 改进建议(简化版):
static void Main(string[] args)
{Console.Write("请输入一个非负整数: ");if (int.TryParse(Console.ReadLine(), out int num) && num >= 0){long result = Factorial(num);Console.WriteLine("result is {0}", result);}else{Console.WriteLine("输入无效!");}Console.ReadKey();
}static long Factorial(int n)
{return n <= 1 ? 1 : n * Factorial(n - 1);
}
这段代码是 C# 中一种安全读取用户输入并进行判断的写法,它的意思是:
“尝试把用户从键盘输入的内容转换成一个整数。如果转换成功,并且这个数大于或等于 0,就去计算它的阶乘。”
🔹核心代码:
if (int.TryParse(Console.ReadLine(), out int num) && num >= 0)
{long result = Factorial(num);Console.WriteLine("result is {0}", result);
}
🔍 分解解释:
1. Console.ReadLine()
- 从控制台(命令行)读取用户输入的一行文本(比如你打字输入
5
)。 - 它返回的是一个 字符串(string),比如
"5"
。
2. int.TryParse(...)
- 这是一个安全的类型转换方法,用来判断一个字符串能不能变成整数。
- 和
Convert.ToInt32(...)
不同,它不会因为输入非法内容(如 abc)而让程序崩溃。
3. out int num
out
是 C# 的关键字,表示这个参数是用来“输出”结果的。- 如果转换成功,
num
就会保存转换后的整数值。- 比如输入
"5"
→num = 5
- 输入
"abc"
→ 转换失败,num = 0
(默认值)
- 比如输入
4. int.TryParse(...)
的返回值
- 成功:返回
true
- 失败(比如输入了
abc
):返回false
5. && num >= 0
- 这是“并且”的意思。
- 不仅要求输入的是合法整数,还要求这个整数 大于或等于 0。
- 因为阶乘只对非负整数有定义(比如
-1!
是没有意义的)。
✅ 整体逻辑流程:
开始↓
用户输入一行文字(比如 "5" 或 "abc")↓
尝试把它转成整数?↘ 是 ✅ → 得到 num 的值↓num >= 0 吗?↘ 是 ✅ → 执行 { } 里面的代码(计算阶乘、输出结果)↙ 否 ❌ → 跳过,不执行↙ 否 ❌ → 转换失败(比如输入了 abc),跳过不执行
结束
🧪 举几个例子:
用户输入 | int.TryParse 结果 | num >= 0 | 是否进入 if 块? | 说明 |
---|---|---|---|---|
5 | ✅ 成功,num=5 | ✅ 是 | ✅ 是 | 正常计算 5! |
0 | ✅ 成功,num=0 | ✅ 是 | ✅ 是 | 计算 0! = 1 |
-3 | ✅ 成功,num=-3 | ❌ 否 | ❌ 否 | 负数,不合法 |
abc | ❌ 失败,num=0 | ✅ 是(0≥0)但前面失败 | ❌ 否 | 字符串无法转数字,整体失败 |
123 | ✅ 成功,num=123 | ✅ 是 | ✅ 是 | 但可能溢出,需注意 |
✅ 为什么这样写更好?
相比直接写:
int num = Convert.ToInt32(Console.ReadLine()); // 输入 abc 会崩溃!
使用 int.TryParse
可以防止程序因用户乱输而崩溃,更加健壮和安全。
✅ 总结一句话:
“先安全地把用户输入转成数字,如果成功并且是正数或零,才去计算阶乘。”