昨晚练手用了两种方案。因为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;
}
}
}