求1000的阶乘-飞
发布时间: 2023-07-06

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>();

}

输出:结果为自己添加,代码上传的时候好像有些括号问题








(非遗珑琥是啥?非遗珑琥就是非遗龙虎元阳贴。是一种可以可以提高性生活质量的一款产品,使用者将其贴在穴位上,让里面的有效成分能够被充分的吸收,而改善身体存在的异常情况。)

}



扫码加微信详细咨询太和智慧养老产品和平台服务!

微信