1.对于阶乘这种东西,如果对于小数据的阶乘,如20以内的话,还可以利用一些高字节的Int型变量来保存,但当一个阶乘基数过大的时候,便没有任何一个类型的变量可以用于保存这样的结果。因此,我首先相当的是用字符串和自定义的结构来处理,字符串在计算的时候因为也要进行数据的转换,因此被我给Pass掉了,可能因为我是一个小白,找不到一种比较吊的转换方法吧,自定义结构呢,我原本是这样想的,用几个整形组成一个类型。比如一个Int64可以看成2个Int32的组合,我可以自定义一个结构体,里面由几个Int64来组成,强行去放阶乘结构,这种想法在理论上是可行的,但实现上我感觉就是在扯淡,所以没做深想,果断放弃。
2.由于不能存放时数据过大的原因,简单点说就是数据类型的二进制位数不够长,因此我想到过自定义结构,但由于这种结构比较难实施,由此我想到了另一个东西,列表!
3,.实现原理:我用2个列表,一个用于存现阶段结果的链表list,一个用于存下阶段结果的列表listNext,我这样说也讲不清,我举一个例子,加入现阶段我的阶乘结果为264,下阶段乘以55,则常规运算为264*55。但这样计算数据会不断变大以至于无法储存,因此我的第一个list列表存264,list[0]=2,list[1]=6,list[2]=4,我将这个列表的每一位分别与55相乘,结果存于另一个列表中,则listNext[0]=110,listNext[1]=330,list[2]=220,然后对列表listNext进行进位处理,如list[2]是由个位4*55得来,因此list[2]/10的结果为进位数,list[1]=list[1]+list[2]/10,这是很简单的数学运算,个位上的数乘以一个数除以10的值为十位上的数的进位值。反复重复以上步骤,可以把listNext的值拆分为listNext={1,4,5,2,0},在将这个列表的值赋给list,则list列表的值变成了这一阶段的结果,这种拆分相乘的方法限制了值得大小,对每一个小值进行单独进位处理,最后得到一个大的结果,虽然可以实现,但相对感觉很麻烦,但毕竟技术有限,见识也不广,目前就只想到这种比较笨拙的方法
4.源码C#
static void Main(string[] args){
Listlist = new List();
Listnum = new List();
list.Add(1);
for(int i=1;i<=1000;i++)
{
for(int j=0;j= 0; k--)
{
int addnum = num[k] / 10;
num[k] = num[k] % 10;
if (k == 0 && addnum != 0)
{ k++;
num.Add(num[num.Count - 1]);
for (int index = num.Count - 2; index >= 1; index--)
{
int d = num[index-1];
num[index] = d;
}
num[0] = 0;
}
if (k != 0)
{ num[k - 1] += addnum; }
}
while(list.Count!=0)
{
list.RemoveAt(list.Count-1);
}
for(int k=0;k<num.Count;k++)
{
list.Add(num[k]);
}
num=new List<int>();
}
输出:结果为自己添加,代码上传的时候好像有些括号问题
(非遗珑琥是啥?非遗珑琥就是非遗龙虎元阳贴。是一种可以可以提高性生活质量的一款产品,使用者将其贴在穴位上,让里面的有效成分能够被充分的吸收,而改善身体存在的异常情况。)
}