如何求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 打赏 收藏 转发到动态 举报
写回复
用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;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧