笔试题:计算N的阶乘

简介:

public class test 
{
    //简单起见,不考虑负号的情况
    private static String multipy(String num1, String num2)
    {//大数乘法
        String result = "0";
        int i,j,n1,n2;
        int len1 = num1.length();
        int len2 = num2.length();
        if (len1 < len2)
        {
            for (i = len1 -1; i >=0; --i)
            {
                n1 = num1.charAt(i) - '0';
                String sum = "0";
                for (j = 0; j < n1; ++j)
                {
                    sum = add(sum,num2);
                }
                StringBuilder tmpSB = new StringBuilder(sum);
                for (j = i; j < len1 -1; ++j)
                {
                    tmpSB.append("0");
                }
                result = add(result,tmpSB.toString());
            }
        }
        else
        {
            for (i = len2 -1; i >=0; --i)
            {
                n2 = num2.charAt(i) - '0';
                String sum = "0";
                for (j = 0; j < n2; ++j)
                {
                    sum = add(sum,num1);
                }
                StringBuilder tmpSB = new StringBuilder(sum);
                for (j = i; j < len2 -1; ++j)
                {
                    tmpSB.append("0");
                }
                result = add(result,tmpSB.toString());
            }
        }

        return result;
    }
    private static String add(String num1, String num2)
    {//大数加法
        String result = "";
        int len1 = num1.length();
        int len2 = num2.length();
        int nAddOn = 0;//进位
        int i,j,n1,n2,sum;
        StringBuilder sb = new StringBuilder();
        for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)
        {
            n1 = num1.charAt(i) - '0';
            n2 = num2.charAt(j) - '0';
            sum = n1 + n2 + nAddOn;
            
            if (sum >= 10)
            {
                nAddOn = 1;
            }
            else
            {
                nAddOn = 0;
            }
            sb.append(sum % 10);
        }
        if (len1 > len2)
        {//第一个有剩余
            for (; i >= 0; --i)
            {
                n1 = num1.charAt(i) - '0';
                sum = n1 + nAddOn;
                if (sum >= 10)
                {
                    nAddOn = 1;
                }
                else
                {
                    nAddOn = 0;
                }
                sb.append(sum % 10);
            }
        }
        else if (len2 > len1)
        {//第二个有剩余
            for (; j >= 0; --j)
            {
                n2 = num2.charAt(j) - '0';
                sum = n2 + nAddOn;
                if (sum >= 10)
                {
                    nAddOn = 1;
                }
                else
                {
                    nAddOn = 0;
                }
                sb.append(sum % 10);
            }
        }
        
        if (nAddOn > 0)
        {
            sb.append(nAddOn);
        }
        
        sb.reverse();
        result = sb.toString();
        return result;
    }
    private static String factorial(int n)
    {
        String result = "1";
        for (int i = n; i >= 2; --i)
        {
            result = multipy(result,String.valueOf(i));
        }
        return result;
    }
    public static void main(String[] args) throws Exception
    {
        //计算100的阶乘!
        System.out.println(factorial(100));
    }

}
复制代码
再来个c++版做对比
复制代码

//简单起见,不考虑负号的情况

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

string add(string num1, string num2)
{//大数加法
    string result = "";
    int len1 = num1.length();
    int len2 = num2.length();
    int nAddOn = 0;//进位
    int i,j,n1,n2,sum;
    vector<char> tmpSum;

    for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)
    {
        n1 = num1[i] - '0';
        n2 = num2[j] - '0';
        sum = n1 + n2 + nAddOn;

        if (sum >= 10)
        {
            nAddOn = 1;
        }
        else
        {
            nAddOn = 0;
        }
        tmpSum.push_back(sum % 10 + '0');
    }
    if (len1 > len2)
    {//第一个有剩余
        for (; i >= 0; --i)
        {
            n1 = num1[i] - '0';
            sum = n1 + nAddOn;
            if (sum >= 10)
            {
                nAddOn = 1;
            }
            else
            {
                nAddOn = 0;
            }
            tmpSum.push_back(sum % 10 + '0');
        }
    }
    else if (len2 > len1)
    {//第二个有剩余
        for (; j >= 0; --j)
        {
            n2 = num2[j] - '0';
            sum = n2 + nAddOn;
            if (sum >= 10)
            {
                nAddOn = 1;
            }
            else
            {
                nAddOn = 0;
            }
            tmpSum.push_back(sum % 10 + '0');
        }
    }

    if (nAddOn > 0)
    {
        tmpSum.push_back(nAddOn + '0');
    }
    reverse(tmpSum.begin(),tmpSum.end());
    copy(tmpSum.begin(),tmpSum.end(),back_inserter(result));
    return result;
}

string multipy(string num1, string num2)
{//大数乘法
    string result = "0";
    int i,j,n1,n2;
    int len1 = num1.length();
    int len2 = num2.length();
    if (len1 < len2)
    {
        for (i = len1 -1; i >=0; --i)
        {
            n1 = num1[i] - '0';
            string sum = "0";
            for (j = 0; j < n1; ++j)
            {
                sum = add(sum,num2);
            }

            string tmpSB(sum);
            for (j = i; j < len1 -1; ++j)
            {
                tmpSB.append("0");
            }
            result = add(result,tmpSB);
        }
    }
    else
    {
        for (i = len2 -1; i >=0; --i)
        {
            n2 = num2[i] - '0';
            string sum = "0";
            for (j = 0; j < n2; ++j)
            {
                sum = add(sum,num1);
            }
            string tmpSB(sum);
            for (j = i; j < len2 -1; ++j)
            {
                tmpSB.append("0");
            }
            result = add(result,tmpSB);
        }
    }

    return result;
}


string factorial(int n)
{
    string result = "1";
    char buff[100];
    for (int i = n; i >= 2; --i)
    {
        result = multipy(result,_itoa(i, buff,10));
    }
    return result;
}

int main()
{
    int N;
    while (cin >> N)
    {
        cout << factorial(N).c_str() << endl;
    }
    return 0;
}
复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/05/03/1448245.html,如需转载请自行联系原作者

目录
相关文章
|
设计模式 安全 测试技术
【C++】—— 单例模式详解
【C++】—— 单例模式详解
188 0
有关HashMap的computeIfAbsent优雅使用方式
有关HashMap的computeIfAbsent优雅使用方式
160 1
信道建模流程 | 带你读《大规模天线波束赋形技术原理与设计 》之二十八
本节将详细介绍衰落信道的整体建模流程,内容上与 3D 信道模 型 3GPP TR36.873 7.3 节和 3GPP TR38.901 的 7.5 节对应。两者在内容上大体相同,前者的目标为6GHz以下的信道建模(记为模型1),后者为0.5~100GHz 的信道建模(记为模型 2)。对于 6GHz 以下的信道建模,两者均可以使用, 在下文的描述中,两者不同的地方均会列出。
信道建模流程  | 带你读《大规模天线波束赋形技术原理与设计 》之二十八
|
6月前
|
存储 前端开发 调度
|
10月前
|
机器学习/深度学习 测试技术
全球首次!时序大模型突破十亿参数,华人团队发布Time-MoE,预训练数据达3000亿个时间点
时序数据在动态系统和应用中至关重要,但其复杂性使得分析极具挑战。Time-MoE是一种基于稀疏混合专家设计的可扩展架构,旨在预训练更大、更强大的时序预测模型,同时降低推理成本。它在新数据集Time-300B上训练,包含超过3000亿个时间点,跨9个领域,显著提升了预测精度,成为解决时序预测问题的先进方案。
459 9
|
Cloud Native Serverless 云计算
云原生时代的技术演进:从微服务到Serverless
在数字化转型的浪潮中,云原生技术正成为推动企业IT架构现代化的重要力量。本文将探讨云原生技术的关键组成部分—微服务与Serverless架构—如何助力企业实现敏捷开发和高效运维。通过深入分析这两种架构模式的优势与挑战,我们旨在为读者揭示云原生环境下的最佳实践和未来发展趋势。
|
12月前
|
JavaScript 前端开发 开发工具
一身反骨的我,用--no-verify绕开了git代码提交限制!
【10月更文挑战第7天】一身反骨的我,用--no-verify绕开了git代码提交限制!
882 0
|
前端开发 JavaScript
React的生命周期简介(十)
【8月更文挑战第15天】React的生命周期简介
149 2
React的生命周期简介(十)
|
数据管理 程序员 人工智能
后台数据管理系统 - 项目架构设计【黑马程序员】
后台数据管理系统 - 项目架构设计【黑马程序员】
504 0
后台数据管理系统 - 项目架构设计【黑马程序员】
|
机器学习/深度学习 传感器 算法
多元分类预测 | Matlab 鲸鱼优化算法优化随机森林(WOA-RF)分类预测
多元分类预测 | Matlab 鲸鱼优化算法优化随机森林(WOA-RF)分类预测