高精度阶乘

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
const int MAX=100000000;
int main()
{
    int N;
    cin>>N;
    vector<long long int> result;
    while(N)
    {
        if(result.empty()==1)
            result.push_back(N);
        else
        {
            for(int i=result.size()-1;i>=0;i--)
            {
                long long temp=N*result[i];
                if((temp/MAX)!=0) //需要进位的时候
                {
                    if(i==result.size()-1)
                        result.push_back(temp/MAX);
                    else
                        result[i+1]+=(temp/MAX);
                    result[i]=temp%MAX;
                }
                else //不需要进位
                {
                    result[i]=temp;
                }
            }
        }
        N--;

    }
    for(int i=result.size()-1;i>=0;i--)
    {
        if(i==result.size()-1)
            cout<<result[i];
        else
            cout<<setw(8)<<setfill('0')<<result[i];
    }
    return 0;
}


思路:vector的每个单元存一个8位的数,做乘法的时候从高位向低位做(即i--),然后如果得数超过八位就加到下一位的数字中(没有下一位要创建)。

写代码过程中的错误

1.vector empty ==1时为空

2.必须用long long int x=long long y*int/long long int z的形式,因为如果等式右边两个均为int,是先执行乘法(可能会超过最大值然后变成负的),再转换成long long ,结果就错了。

3.setw(8)<<setfill('0')<<result[i]不能调换顺序,如果setfill'0'放在result[i]后面则再第一次打印result[i]时是不会加'0'的。还有使用c++里的格式化输出一定要加iomanip的头文件。

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
### 实现高精度阶乘计算 对于大数的阶乘计算,传统的整型数据类型(如 `int` 或 `long long`)无法存储其庞大的结果。因此,需要采用高精度计算方法来处理这一问题。以下是基于 C# 和 Python 的两种实现方式。 #### 方法一:C# 中的大数阶乘计算 在 C# 中可以使用字符串数组模拟多位数的加法和乘法规则来进行高精度计算。具体思路如下: 1. 使用一个整型数组表示大数的每一位数字。 2. 利用循环逐步累乘每一个因数,并更新当前的结果数组。 3. 考虑进位操作,在每次相乘之后调整数组中的值。 下面是具体的代码实现: ```csharp using System; class Program { static void Main() { Console.Write("请输入要计算阶乘的正整数 n: "); int n = Convert.ToInt32(Console.ReadLine()); int[] result = Factorial(n); // 输出结果 Array.Reverse(result); // 反转数组以便正确显示 foreach (var digit in result) Console.Write(digit); } static int[] Factorial(int n) { int[] res = new int[n * 5]; // 结果数组大小预估 res[0] = 1; // 初始化为1 int size = 1; // 当前结果的有效长度 for (int i = 2; i <= n; ++i) { int carry = 0; for (int j = 0; j < size || carry != 0; ++j) { if (j >= size && carry == 0) break; int product = (j < size ? res[j] : 0) * i + carry; res[j] = product % 10; carry = product / 10; if (j >= size - 1 && carry > 0) size++; } } int[] finalResult = new int[size]; Array.Copy(res, finalResult, size); return finalResult; } } ``` 上述代码通过逐位相乘并记录进位的方式实现了高精度阶乘计算[^1]。 --- #### 方法二:Python 自带支持大数运算 Python 提供了内置的支持大数运算的功能,无需额外编写复杂逻辑即可完成高精度阶乘计算。这得益于 Python 对于任意精度整数的良好支持。 下面是一个简单的例子: ```python def factorial(n): if n == 0 or n == 1: return 1 else: return n * factorial(n - 1) n = int(input("请输入要计算阶乘的正整数 n: ")) print(f"{n}! =", factorial(n)) ``` 如果希望进一步优化性能,还可以改写成迭代版本以减少递归调用带来的开销: ```python def iterative_factorial(n): result = 1 for i in range(2, n + 1): result *= i return result n = int(input("请输入要计算阶乘的正整数 n: ")) print(f"{n}! =", iterative_factorial(n)) ``` 这两种方法均能有效应对较大的输入范围,而不需要手动管理内存或设计复杂的算法结构[^2]。 --- ### 总结 无论是选择 C# 还是 Python 来实现高精度阶乘计算,核心思想都是相同的——即借助数组或其他容器保存中间结果,并妥善处理每一次乘法过程中产生的进位现象。不同之处在于语言特性决定了其实现难度以及效率差异。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值