社区
数据结构与算法
帖子详情
如何求N!的最末位的非零项?(0<=N<=10^100)
sommer
2003-08-25 01:09:28
10!=362800 结果是8
20!=2432902008176640000 结果是4
65!=8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000 结果是6
9999 的结果是8
这题该如何做啊?
...全文
50
14
打赏
收藏
如何求N!的最末位的非零项?(0<=N<=10^100)
10!=362800 结果是8 20!=2432902008176640000 结果是4 65!=8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000 结果是6 9999 的结果是8 这题该如何做啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
a0002
2003-08-27
打赏
举报
回复
统计因数的方法是不现实的,因为是大数问题,因子分解就太费时间了!
a0002
2003-08-26
打赏
举报
回复
靠,乱说话啊,(10^100)!算出来有多大,算一次要多少时间,你知道吗?
Riemann
2003-08-26
打赏
举报
回复
http://expert.csdn.net/Expert/topic/1769/1769766.xml?temp=.2003748
littlecpu
2003-08-26
打赏
举报
回复
我靠,从后面算起,找到不是0或不是char '0' 的不就行了吗?(传入的是字符串或int数组(int[], 0<=int[n]<10)
BlueSky2008
2003-08-26
打赏
举报
回复
N<=10^100?
xdspower
2003-08-26
打赏
举报
回复
当时的讨论贴
http://expert.csdn.net/Expert/topic/1465/1465828.xml?temp=.4934809
xdspower
2003-08-26
打赏
举报
回复
这个问题其实在论坛中讨论过的,而且不是要求最后一位,而是倒数5位,其实方法是一样的,对每个n先去调后面的0,由于在从1开始连续整数中,含有2因数的数比含有5因数的数要多,这样统计最小分解后含有多少个2因数,在减去多少个5因数,比如25含有2个,这样就可以统计出还有多少个2因数以及其他因数3,7,9等等,这样对这些数在求积,每次把积的最末位(不会出现0了)再加入计算这样就可以最终求出最末位了。
sommer
2003-08-26
打赏
举报
回复
贴个正确的(但没看懂),大家看看是什么原理:
#include <iostream.h>
#include <string.h>
int main()
{
char number[200];
while(cin >> number)
{
int length = (int)strlen(number);
int* num = new int[length + 1];
int first=0;
int end=length-1;
int i;
for(i = 0; i < length; i++)
{
num[i] = number[i] - '0';
}
int five = 0,other = 0,all;
while(end != 0)
{
if((num[end] < 5) && (first == end))
break;
switch(num[end])
{
case 9: other += 2;
case 8: other += 3;
case 7: other += 1;
case 6: other += 0;
case 5:
case 4: other += 2;
case 3: other += 3;
case 2: other += 1;
case 1: other += 0;
}
for(i = first; i <= end; i++)
{
if(i < end)
num[i+1] += num[i] % 5 * 10;
num[i] = num[i] / 5;
}
five += num[end - 1] * 10 + num[end];
if(num[first] == 0)
first++;
}
int temp = 1;
other %= 4;
five %= 4;
all = (other + 4 - five) % 4;
all += 4 * (end > 0);
for(i = 1; i <= num[end]; i++)
if(i == 5)
temp /= 2;
else
temp *= i;
for(i = 1; i <= all; i++)
temp *= 2;
cout << temp % 10 << endl;
delete []num;
}
return 1;
}
寻开心
2003-08-25
打赏
举报
回复
和5相乘是需要处理进位的,所以使用程序做法是保留最后两位非0的数据。
使用保留的这两位和乘数的最后一位做乘法处理
大概也可以找到规律吧。
sommer
2003-08-25
打赏
举报
回复
n很大,有100位之长啊
sommer
2003-08-25
打赏
举报
回复
可不可以不要贴代码,能否详细说明一下原理方法,麻烦了
wbh0360
2003-08-25
打赏
举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Factorial( int *array , const int ArraySize,const int n )
{
int i;
int j;
array[0] = 1;
for( i = 1; i<= n; i++ )
{
for( j = 0; j < ArraySize-1; j++)
{
array[j] *= i;
}
for( j = 0 ; j < ArraySize - 1;j++ )
{
array[j+1] += array[j]/10;
array[j] %= 10;
}
}
}
int main()
{
int *p;
int n;
int i;
printf( "%ÊäÈëÏëÒª¼ÆËãµÄ½×³Ë\n" );
scanf( "%d",&n );
p=(int*) malloc( sizeof(int)*n);
memset( p,0,sizeof(int)*n);
Factorial( p,n,n);
for( i = n-1;i>=0;i-- )
printf( "%d",p[i] );
printf("\n\n");
for( i=0;i<n;i++)
if(p[i]!=0) break;
printf("%s%d\n","×îĩλµÄ·ÇÁãÏî:",p[i]);
return 0;
}
a0002
2003-08-25
打赏
举报
回复
看看我的程序吧,问题的关键是要处理5的乘方,比如5的100次方,当n>5^100时,在n!中会导致结果出现100个0,所以当计算到n>5^100!时,对结果取模应该保留最后101位!
a0002
2003-08-25
打赏
举报
回复
#include "stdafx.h"
#include <iostream.h>
#include <math.h>
int main(int argc, char* argv[])
{
unsigned i, n, m;
cout << "enter your number: ";
cin >> n;
m = 1;
unsigned iModular = (0 == n % 5)
? (unsigned)floor( log( n + 0.0001 ) / log( 5 ) ) + 1
: (unsigned)floor( log( n + 0.0001 ) / log( 5 ) );
iModular = (unsigned)pow(10, (unsigned)iModular);
for(i = 2; i <= n; i++)
{
if(i == n) cout << "m: " << m << endl;
m *= i;
while( 0 == (m % 10) ) m = (unsigned)(m/10);
m = m % iModular;
}
cout << "result: " << m % 10 << endl;
return 0;
}
Excel公式大全操作应用实例(史上最全)
如何实现
求
平均值时只对不等于零的数
求
均值? 平均分的问题 怎样
求
最大值(最小值或中间值)平均数怎么弄 去掉其中两个最大值和两个最小值的公式 去一行最高分最低分
求
平均值 在9个数值中去掉最高与最低然后
求
平均值...
EXCEL函数公式集
如何实现
求
平均值时只对不等于零的数
求
均值? 平均分的问题 怎样
求
最大值(最小值或中间值)平均数怎么弄 去掉其中两个最大值和两个最小值的公式 去一行最高分最低分
求
平均值 在9个数值中去掉最高与最低然后
求
平均值...
求
N!的最
末位
非零数
先看一个网友给的巧妙的解题思路: 解题过程: 这题的解法很多,有很多解法现在还不是很理解,受网上朋友启发,觉得下面的算法是比较易懂的,现在归纳一下。 ......x2*5=...
10
(舍,因为非零末
如何确定一个N!末尾有多少个零
是由2*5所得,在1~
10
0
当中,可以产生
10
的有:0 2 4 5 6 8 结尾的数字,显然2是足够的,因为4、6、8当中都含有因子2,所以都可看当是2,那么关键在于5的数量了那么该问题的实质是要
求
出1~
10
0
含有多
AtCoder E - Double Factorial(判断阶乘后面0的个数)
n!=n∗(n−2)∗(n−4)......n!=n*(n-2)*(n-4)......n!=n∗(n−2)∗(n−4)...... 思路: 我们知道要
求
阶乘尾部000的位数: 如果乘积要产生000的话,那么他们分解的因子中肯定会有 2∗52*52∗5,又因为因子中222的个数...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章