user-0 提问: C语言

回复:
user: user-1
content: 可用分和技术分是两码事，可用分只能每天回帖一次拿10分，帖子的评分是增加的技术分，也就是版块等级，说实话，那个一点意义也没有，因为部分会员是CSDN内部人员，每天有固定的技术分增长点数的（数据库里直接刷）

user: user-2
content: const long long int MOD =100000000LL; long long int a[40]={1LL};  int main() {     int l=1;     for(int i=2;i<=100;i++){         long long int cy=0LL;         for(int j=0;j<l;j++){             cy +=a[j]*(long long int)i;             a[j] =cy%MOD;             cy  /=MOD;         }         if(cy) a[l++]=cy;     }     printf("%lld",a[l-1]);     for(int i=l-2;i>=0;i--) printf("%08lld",a[i]);     puts("");     return 0; }

user: user-3
content: 引用 6 楼 cfjtaishan 的回复:[quote=引用 2 楼 v1eejing 的回复:] [quote=引用 楼主 ljtyllr001 的回复:] 100的阶乘怎么写 楼主，我写给你，你把分给我（我的分快用完了）：  （1）如果用常规的数据类型无法存储，用数组来相乘  （2）100的阶乘大概有160多位，所以先建立一个170个元素的整型数组； 0 0 0 0 0 .............................................1 先把这个数组全部清零，然后把末位置为1；  是因为准备从后往前乘数，依此乘1，2，3，4，5，一直到100. ...  但是每一次乘以一个数，都要把这170个元素都乘以一遍； 原因是： 假如从计算结果中间来看； 有这样一种情况： 00000000000000000000000000000  ~~~~ 1 2 0 这个结果是5！，假如再乘以6呢，就相当于把每一位都乘以6  这里就出现进位问题，有三句经典代码： a[n]=a[n]*k+Tp;   //k依次为1，2，3，4，5，Tp是进位值，初始化的时候为0； Tp=a[n]/10;  //得到进位，如果所在元素不满10，就没有进位，得到0； a[n]=a[n]%10;  //同理，如果该元素不满10，就还是原值，如果超过10，就只能得到余数， __________________________ 这是一个思路，具体可以自己修改，但是得到正确结果是没有问题 的； ———————————————— [code=c#]include <iostream> #include <cmath> using namespace std; int main() { 	int Tp=0,n,k; 	int a[170]; //定义170个元素的数组; 	 	for(n=0;n<170;n++)//数组全部置0; 	a[n]=0; 	 	a[169]=1;//末尾置1，准备乘2； 	 	for(k=1;k<=100;k++) //外层循环，100的阶乘； 					  //外层循环的数可以改写，比如写成5进行验证;     	for(n=169;n>=0;n--)//内层循环，每乘一个数需要乘170次；     		{     			a[n]=a[n]*k+Tp;     			Tp=a[n]/10;//得到进位值Tp;     			a[n]=a[n]%10;   			     		}     for(n=0;n<170;n++) //输出结果；     	cout<<a[n];      return 0; } [/code]  [/quote] +++，验证过了；不错哦；理解起来还不算难；赞一个~[/quote] 那是当然，我的想法就是编程平民化，不要搞高大上的术语，只要识字就能看的懂什么意思。所有的思维，一通俗化就变的很简单，问题是总有一波人要把简单的问题复杂化。但是我的分呢？？？

user: user-4
content: const int MOD =10000; int a[40]={1};  int main() {     int l=1;     for(int i=2;i<=100;i++){         int cy=0;         for(int j=0;j<l;j++){             cy +=a[j]*i;             a[j] =cy%MOD;             cy  /=MOD;         }         if(cy) a[l++]=cy;     }     printf("%d",a[l-1]);     for(int i=l-2;i>=0;i--) printf("%04d",a[i]);     puts("");     return 0; }

user: user-5
content: 引用 7 楼 v1eejing 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 2 楼 v1eejing 的回复:] [quote=引用 楼主 ljtyllr001 的回复:] 100的阶乘怎么写 楼主，我写给你，你把分给我（我的分快用完了）：  （1）如果用常规的数据类型无法存储，用数组来相乘  （2）100的阶乘大概有160多位，所以先建立一个170个元素的整型数组； 0 0 0 0 0 .............................................1 先把这个数组全部清零，然后把末位置为1；  是因为准备从后往前乘数，依此乘1，2，3，4，5，一直到100. ...  但是每一次乘以一个数，都要把这170个元素都乘以一遍； 原因是： 假如从计算结果中间来看； 有这样一种情况： 00000000000000000000000000000  ~~~~ 1 2 0 这个结果是5！，假如再乘以6呢，就相当于把每一位都乘以6  这里就出现进位问题，有三句经典代码： a[n]=a[n]*k+Tp;   //k依次为1，2，3，4，5，Tp是进位值，初始化的时候为0； Tp=a[n]/10;  //得到进位，如果所在元素不满10，就没有进位，得到0； a[n]=a[n]%10;  //同理，如果该元素不满10，就还是原值，如果超过10，就只能得到余数， __________________________ 这是一个思路，具体可以自己修改，但是得到正确结果是没有问题 的； ———————————————— [code=c#]include <iostream> #include <cmath> using namespace std; int main() { 	int Tp=0,n,k; 	int a[170]; //定义170个元素的数组; 	 	for(n=0;n<170;n++)//数组全部置0; 	a[n]=0; 	 	a[169]=1;//末尾置1，准备乘2； 	 	for(k=1;k<=100;k++) //外层循环，100的阶乘； 					  //外层循环的数可以改写，比如写成5进行验证;     	for(n=169;n>=0;n--)//内层循环，每乘一个数需要乘170次；     		{     			a[n]=a[n]*k+Tp;     			Tp=a[n]/10;//得到进位值Tp;     			a[n]=a[n]%10;   			     		}     for(n=0;n<170;n++) //输出结果；     	cout<<a[n];      return 0; } [/code]  [/quote] +++，验证过了；不错哦；理解起来还不算难；赞一个~[/quote] 那是当然，我的想法就是编程平民化，不要搞高大上的术语，只要识字就能看的懂什么意思。所有的思维，一通俗化就变的很简单，问题是总有一波人要把简单的问题复杂化。但是我的分呢？？？[/quote] 赞

user: user-6
content: 引用 2 楼 v1eejing 的回复:[quote=引用 楼主 ljtyllr001 的回复:] 100的阶乘怎么写 楼主，我写给你，你把分给我（我的分快用完了）：  （1）如果用常规的数据类型无法存储，用数组来相乘  （2）100的阶乘大概有160多位，所以先建立一个170个元素的整型数组； 0 0 0 0 0 .............................................1 先把这个数组全部清零，然后把末位置为1；  是因为准备从后往前乘数，依此乘1，2，3，4，5，一直到100. ...  但是每一次乘以一个数，都要把这170个元素都乘以一遍； 原因是： 假如从计算结果中间来看； 有这样一种情况： 00000000000000000000000000000  ~~~~ 1 2 0 这个结果是5！，假如再乘以6呢，就相当于把每一位都乘以6  这里就出现进位问题，有三句经典代码： a[n]=a[n]*k+Tp;   //k依次为1，2，3，4，5，Tp是进位值，初始化的时候为0； Tp=a[n]/10;  //得到进位，如果所在元素不满10，就没有进位，得到0； a[n]=a[n]%10;  //同理，如果该元素不满10，就还是原值，如果超过10，就只能得到余数， __________________________ 这是一个思路，具体可以自己修改，但是得到正确结果是没有问题 的； ———————————————— [code=c#]include <iostream> #include <cmath> using namespace std; int main() { 	int Tp=0,n,k; 	int a[170]; //定义170个元素的数组; 	 	for(n=0;n<170;n++)//数组全部置0; 	a[n]=0; 	 	a[169]=1;//末尾置1，准备乘2； 	 	for(k=1;k<=100;k++) //外层循环，100的阶乘； 					  //外层循环的数可以改写，比如写成5进行验证;     	for(n=169;n>=0;n--)//内层循环，每乘一个数需要乘170次；     		{     			a[n]=a[n]*k+Tp;     			Tp=a[n]/10;//得到进位值Tp;     			a[n]=a[n]%10;   			     		}     for(n=0;n<170;n++) //输出结果；     	cout<<a[n];      return 0; } [/code]  [/quote] +++，验证过了；不错哦；理解起来还不算难；赞一个~

user: user-2
content: 小白们难道都不会小学三年级乘法竖式吗？

user: user-7
content: 引用 4 楼 赵4老师的回复:小白们难道都不会小学三年级乘法竖式吗？ 让老师见笑了

user: user-8
content: 引用 2楼胖熊二 的回复:[quote=引用 楼主 ljtyllr001 的回复:] 100的阶乘怎么写 楼主，我写给你，你把分给我（我的分快用完了）：  （1）如果用常规的数据类型无法存储，用数组来相乘  （2）100的阶乘大概有160多位，所以先建立一个170个元素的整型数组； 0 0 0 0 0 .............................................1 先把这个数组全部清零，然后把末位置为1；  是因为准备从后往前乘数，依此乘1，2，3，4，5，一直到100. ...  但是每一次乘以一个数，都要把这170个元素都乘以一遍； 原因是： 假如从计算结果中间来看； 有这样一种情况： 00000000000000000000000000000  ~~~~ 1 2 0 这个结果是5！，假如再乘以6呢，就相当于把每一位都乘以6  这里就出现进位问题，有三句经典代码： a[n]=a[n]*k+Tp;   //k依次为1，2，3，4，5，Tp是进位值，初始化的时候为0； Tp=a[n]/10;  //得到进位，如果所在元素不满10，就没有进位，得到0； a[n]=a[n]%10;  //同理，如果该元素不满10，就还是原值，如果超过10，就只能得到余数， __________________________ 这是一个思路，具体可以自己修改，但是得到正确结果是没有问题 的； ———————————————— [code=c#]include <iostream> #include <cmath> using namespace std; int main() { 	int Tp=0,n,k; 	int a[170]; //定义170个元素的数组; 	 	for(n=0;n<170;n++)//数组全部置0; 	a[n]=0; 	 	a[169]=1;//末尾置1，准备乘2； 	 	for(k=1;k<=100;k++) //外层循环，100的阶乘； 					  //外层循环的数可以改写，比如写成5进行验证;     	for(n=169;n>=0;n--)//内层循环，每乘一个数需要乘170次；     		{     			a[n]=a[n]*k+Tp;     			Tp=a[n]/10;//得到进位值Tp;     			a[n]=a[n]%10;   			     		}     for(n=0;n<170;n++) //输出结果；     	cout<<a[n];      return 0; } [/code]  [/quote]人家一个小白，你是说的多么复杂

user: user-3
content: 引用 楼主 ljtyllr001 的回复:100的阶乘怎么写 楼主，我写给你，你把分给我（我的分快用完了）：  （1）如果用常规的数据类型无法存储，用数组来相乘  （2）100的阶乘大概有160多位，所以先建立一个170个元素的整型数组； 0 0 0 0 0 .............................................1 先把这个数组全部清零，然后把末位置为1；  是因为准备从后往前乘数，依此乘1，2，3，4，5，一直到100. ...  但是每一次乘以一个数，都要把这170个元素都乘以一遍； 原因是： 假如从计算结果中间来看； 有这样一种情况： 00000000000000000000000000000  ~~~~ 1 2 0 这个结果是5！，假如再乘以6呢，就相当于把每一位都乘以6  这里就出现进位问题，有三句经典代码： a[n]=a[n]*k+Tp;   //k依次为1，2，3，4，5，Tp是进位值，初始化的时候为0； Tp=a[n]/10;  //得到进位，如果所在元素不满10，就没有进位，得到0； a[n]=a[n]%10;  //同理，如果该元素不满10，就还是原值，如果超过10，就只能得到余数， __________________________ 这是一个思路，具体可以自己修改，但是得到正确结果是没有问题 的； ———————————————— [code=c#]include <iostream> #include <cmath> using namespace std; int main() { 	int Tp=0,n,k; 	int a[170]; //定义170个元素的数组; 	 	for(n=0;n<170;n++)//数组全部置0; 	a[n]=0; 	 	a[169]=1;//末尾置1，准备乘2； 	 	for(k=1;k<=100;k++) //外层循环，100的阶乘； 					  //外层循环的数可以改写，比如写成5进行验证;     	for(n=169;n>=0;n--)//内层循环，每乘一个数需要乘170次；     		{     			a[n]=a[n]*k+Tp;     			Tp=a[n]/10;//得到进位值Tp;     			a[n]=a[n]%10;   			     		}     for(n=0;n<170;n++) //输出结果；     	cout<<a[n];      return 0; } [/code]

user: user-9
content: 100阶乘后的结果太大，用double保存吧  如下；   int main() { 	double num = 1.0; 	for(int i = 1; i < 101; ++i) 		num *= (double)i; 	printf("%g", num); 	return 0; }