#############################################
N!读为N的阶乘,这里的N是非负的,例如:
你的任务就是写一个程序计算出给出的数的阶乘结果的最后一位非0数字 (0
Input
输入数据包含一个或几个非整数且不会大于10000,每个数字占有独立的一行.对于每个N,读入N,并计算出N!的最后一位不为0的数字。
Output
对于每个输入数字,你的输出要单独占一行.每行先输出N占5个字符,且靠右对齐.然后输出” -> “最后输出N!的最后一位不为0的数字。
###############################
如果输入的数很大了 十进制就不行了~~求万进制 解法~~~~~~~~~~~~~~~~~~~
15 个解决方案
#1
网上有高精度阶乘算法啊。在输出时加上最后一位非0的判断即可。
#include <stdio.h>
#define N 5000 // modify it to hold larger number
int main(void) {
int n, i, j, s, up, f[N] = {0};
scanf("%d", &n);
for (i = 2, f[0] = 1; i <= n; i++)
for (j = up = 0; j < N; j++) {
s = f[j] * i + up;
f[j] = s % 10;
up = s / 10;
}
for (i = N-1; f[i] == 0; i--) ;
for (; i >= 0; i--) printf("%d", f[i]) ;
printf("\n");
return 0;
}
#2
所谓万进制就是每位数字的范围为0000..9999
比如两位万进制数(1234)(5678)对应十进制数(1234)*10000+(5678)==12345678
比如两位万进制数(1234)(5678)对应十进制数(1234)*10000+(5678)==12345678
#3
求N!的最后一位非零的数字,不需要求N!的具体值....
int main(void) {
int n, val;
scanf("%d", &n);
if(n<1)
{
printf("Input Number Error\n");
return 0;
}
val = 1;
for(int i = 2; i <= n; i++)
{
val *= i;
while(val%10 == 0) //去掉val后面的0
val /= 10;
val %= 100; // 只保留 最后2位非零数字即可,前面的数字统统丢掉。
}
printf("%d", val%10); 输出val的个位数字,就是N!的最后一位非0数字。
printf("\n");
return 0;
}
#4
3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.
#5
之所以取2位有效数字是因为:
14 * 5 = 70
24 * 5 = 120
虽然被乘数都是以4结尾,但是乘以5以后一个编程7,一个变成2了。
#6
#7
#8
佩服!
#9
玛雅文明 是 20进制
#10
学习 一个 语言 是学习一种 文化,
学习 一个 算法 是学习一种 文明,
学习 一个 算法 是学习一种 文明,
#11
学习了。
#12
应该说val=%100只能保证100以内的阶乘数的最后非零数计算正确
譬如125*8=1000,应为1;若保留两位则是25*8=200,为2;若保留一位则是5*8=40,为4.后两种都是错误的。
针对N<5000,应该保留三位吧! 还有前面例子应该是25*4=100出现问题。
这些都是我们专业的牛人搞出来的!
譬如125*8=1000,应为1;若保留两位则是25*8=200,为2;若保留一位则是5*8=40,为4.后两种都是错误的。
针对N<5000,应该保留三位吧! 还有前面例子应该是25*4=100出现问题。
这些都是我们专业的牛人搞出来的!
#13
不对应该保留五位。见高手分析:这显然不对,x5 * 8就不一定是x40了,受了x的最后一位的影响
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95*4998=74810
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95*4998=74810
#14
为什么不用Python语言直接算N!呢?
#15
178125 *128=22800000
278125 *128=35600000
#1
网上有高精度阶乘算法啊。在输出时加上最后一位非0的判断即可。
#include <stdio.h>
#define N 5000 // modify it to hold larger number
int main(void) {
int n, i, j, s, up, f[N] = {0};
scanf("%d", &n);
for (i = 2, f[0] = 1; i <= n; i++)
for (j = up = 0; j < N; j++) {
s = f[j] * i + up;
f[j] = s % 10;
up = s / 10;
}
for (i = N-1; f[i] == 0; i--) ;
for (; i >= 0; i--) printf("%d", f[i]) ;
printf("\n");
return 0;
}
#2
所谓万进制就是每位数字的范围为0000..9999
比如两位万进制数(1234)(5678)对应十进制数(1234)*10000+(5678)==12345678
比如两位万进制数(1234)(5678)对应十进制数(1234)*10000+(5678)==12345678
#3
求N!的最后一位非零的数字,不需要求N!的具体值....
int main(void) {
int n, val;
scanf("%d", &n);
if(n<1)
{
printf("Input Number Error\n");
return 0;
}
val = 1;
for(int i = 2; i <= n; i++)
{
val *= i;
while(val%10 == 0) //去掉val后面的0
val /= 10;
val %= 100; // 只保留 最后2位非零数字即可,前面的数字统统丢掉。
}
printf("%d", val%10); 输出val的个位数字,就是N!的最后一位非0数字。
printf("\n");
return 0;
}
#4
3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.
#5
之所以取2位有效数字是因为:
14 * 5 = 70
24 * 5 = 120
虽然被乘数都是以4结尾,但是乘以5以后一个编程7,一个变成2了。
#6
#7
#8
佩服!
#9
玛雅文明 是 20进制
#10
学习 一个 语言 是学习一种 文化,
学习 一个 算法 是学习一种 文明,
学习 一个 算法 是学习一种 文明,
#11
学习了。
#12
应该说val=%100只能保证100以内的阶乘数的最后非零数计算正确
譬如125*8=1000,应为1;若保留两位则是25*8=200,为2;若保留一位则是5*8=40,为4.后两种都是错误的。
针对N<5000,应该保留三位吧! 还有前面例子应该是25*4=100出现问题。
这些都是我们专业的牛人搞出来的!
譬如125*8=1000,应为1;若保留两位则是25*8=200,为2;若保留一位则是5*8=40,为4.后两种都是错误的。
针对N<5000,应该保留三位吧! 还有前面例子应该是25*4=100出现问题。
这些都是我们专业的牛人搞出来的!
#13
不对应该保留五位。见高手分析:这显然不对,x5 * 8就不一定是x40了,受了x的最后一位的影响
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95*4998=74810
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95*4998=74810
#14
为什么不用Python语言直接算N!呢?
#15
178125 *128=22800000
278125 *128=35600000