C#阶乘

昨晚练手用了两种方案。因为Int64也只能算到20的阶乘,就尝试写了下。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace jiecheng
{
    class Program
    {
        //数组法,速度快,但是还是会溢出 PS,LZ觉得可以结合字符串方法,用两个int字符串 如此便不会溢出
        static void Main(string[] args)
        {
            string str = "";
            str = System.Console.ReadLine();
            Int64 c = Int64.Parse(str);
            Int64[] x = new Int64[1000];
            bool a = false;
            x[999] = 1;
            for (Int64 m = 1; m <= c; m++)
            {

                for (int i = 0; i < 1000; i++)
                {
                    x[i] = (Int64)(x[i] * m);
                }

                for (int i = 999; i > 0; i--)
                {
                    x[i - 1] += (Int64)(x[i] / 100000000L);
                    x[i] = x[i] % 100000000L;
                }
            }
            for (int i = 0; i < 1000; i++)
            {
                if (x[i] == 0&&!a)
                {
                    continue;
                }
                if (!a)
                {
                    a = true;
                    System.Console.Write(x[i].ToString());
                    continue;
                }
                
                System.Console.Write(x[i].ToString().PadLeft(8, '0'));
            }

            System.Console.WriteLine();

            System.Console.WriteLine();

            //jiecheng();
        }

        //字符串法,此方法优势在于不会溢出,缺点太复杂,占资源。
        static void jiecheng()
        {
            //思路:利用string存放数据防止内存溢出,相乘思路:竖式
            //          9999
            //       *  1111
            //     ----------
            //       0009999
            //       0099990
            //       0999900
            //       9999000
            //     ----------
            //        Result
            //如此每次由下向上算前两层式子的和(逐位相加),从而解决大数相乘问题
            string str = "100";//str的阶乘
            //str = System.Console.ReadLine();
            string str_bc = "";//被乘数
            string str_c = "1";//乘数
            string str_s = "0";//竖式上一行的结果
            string str_x = "0";//竖式最下一行的结果
            string temp_sum = "";//临时存放str_x与str_s的相加结果
            string sum = "1";//总和
            int jin = 0;//竖式的进位标志


            //阶乘循环
            for (int m = 2; m <= int.Parse(str); m++)
            {
                str_bc = m.ToString();//将比较短的数据赋予被乘数...怕溢出,做乘时都是乘数逐位与被乘数相乘,so乘数的位数不用考虑
                str_c = sum;
                //补位,为字符串尾部补"0"
                str_x = bu(int.Parse(str_bc) * int.Parse(str_c.ToCharArray()[0].ToString()) + "", false, str_c.Length - 1);
                temp_sum = "";
                //乘法循环
                for (int j = 1; j < str_c.Length; j++)
                {
                    //补位,为字符串尾部补"0"
                    str_s = bu(int.Parse(str_bc) * int.Parse(str_c.ToCharArray()[j].ToString()) + "", false, str_c.Length - 1 - j);
                    if (str_s.Length < str_x.Length)
                    {//补位,将短的字符串前部补"0",使两个字符串长度相等,方便逐位计算
                        str_s = bu(str_s, true, str_x.Length - str_s.Length);
                    }
                    //加法循环,逐位求和
                    for (int i = str_x.Length - 1; i >= 0; i--)
                    {
                        temp_sum = (jin + int.Parse(str_x.ToCharArray()[i].ToString()) + int.Parse(str_s.ToCharArray()[i].ToString())) % 10 + temp_sum;
                        jin = (int)(jin + int.Parse(str_x.ToCharArray()[i].ToString()) + int.Parse(str_s.ToCharArray()[i].ToString())) / 10;
                    }
                    if (jin == 1)
                    {
                        temp_sum = jin + temp_sum;
                    }
                    jin = 0;
                    str_x = temp_sum;
                    temp_sum = "";
                }
                sum = str_x;
                //System.Console.WriteLine(str_x);
            }
            System.Console.WriteLine(sum);
            //System.Console.WriteLine(sum.Length);
        }

        //补位函数
        static string bu(string str, bool qian, int times)
        {
            for (int i = 0; i < times; i++)
            {
                if (!qian)
                {
                    str = str + "0";
                }
                else
                {
                    str = "0" + str;
                }
            }
            return str;
        }

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值