当前位置: 首页 > news >正文

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

⚠️ 注意事项(潜在问题):

  1. 输入范围限制

    • Convert.ToInt16() 只能处理 -32768 到 32767 的整数。
    • 阶乘增长极快,超过 12! 就会超过 int 范围,导致溢出(结果错误)。
    • 建议改用 longBigInteger(需引入 System.Numerics)处理大数。
  2. 未处理非法输入

    • 如果用户输入非数字(如 abc),程序会抛出异常崩溃。
    • 建议使用 int.TryParse() 来安全读取输入。
  3. 命名建议

    • 类名建议使用 PascalCase,如 JieChengExecuteJieCheng
    • 方法名也应为 CalculateFactorial 等更清晰的命名。

✅ 改进建议(简化版):

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 可以防止程序因用户乱输而崩溃,更加健壮和安全


✅ 总结一句话:

“先安全地把用户输入转成数字,如果成功并且是正数或零,才去计算阶乘。”

这是一种在实际开发中非常推荐的编程习惯:永远不要相信用户的输入!

http://www.dtcms.com/a/334535.html

相关文章:

  • C# 元组的用法
  • Nona生命之树作品TRO突袭,冻结名单曝光
  • Vue2.x核心技术与实战(一)
  • 摩搭api 实现
  • 025 理解文件系统
  • 多机编队——(6)解决机器人跟踪过程中mpc控制转圈问题
  • 第四章 Linux实用操作
  • OpenJDK 17的C1和C2编译器实现中,方法返回前插入安全点(Safepoint Poll)的机制
  • 【LeetCode题解】LeetCode 35. 搜索插入位置
  • [Linux] Linux逻辑卷管理
  • 知识点汇总linuxC高级 -2系统命令压缩与链接
  • RK3568 NPU RKNN(三):RKNN-ToolKit2模型构建与推理
  • 【LeetCode】算法详解#13 ---回文链表
  • Vue 3.5重磅更新:响应式Props解构,让组件开发更简洁高效
  • [Linux] Linux交换空间管理 Linux系统启动原理
  • 慧穗云开放平台 CDK 开票对接
  • echart中x的0位置出现柱子宽度被裁掉一部分的问题
  • 技术日记2025年08月16日
  • 基于FPGA的实时图像处理系统(1)——SDRAM回环测试
  • python---异常处理
  • Redis知识整理
  • 【论文笔记】STORYWRITER: A Multi-Agent Framework for Long Story Generation
  • 云服务平台主流架构的相关知识体系剖析
  • ABM和强化学习-2015年全国大学生数学建模竞赛B题
  • 安卓11 12系统修改定制化_____修改系统 解锁system分区 去除data加密 自由删减系统应用
  • JetPack系列教程(七):Palette——让你的APP色彩“飞”起来!
  • sql链接的url中serverTimezone的作用
  • 【大模型微调系列-04】 神经网络基础与小项目实战
  • windows环境下使用vscode以及相关插件搭建c/c++的编译,调试环境
  • GIMP:功能强大的跨平台图像处理软件