N!最右边的非零位的值

阶乘问题

Time Limit:   5000MS       Memory Limit:   65535KB
Submissions:   348       Accepted:   37


Description

也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600
12的阶乘最右边的非零位为6。
写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有2499999个零。
Input

仅一行包含一个正整数N。
Output

单独一行包含一个整数表示最右边的非零位的值。
Sample Input
12

Sample Output
6

【解法一】
#include <stdio.h>
int main()
{
 int num, p=1;
 scanf("%d",&num);
 while(num)
 {
  p*=num;
  while(p%10==0)
   p/=10;
  p%=10;
  num--;
 }
 printf("%d\n",p);
return 0;
}
【解法二:储存一定数】

# include<iostream>
using namespace std;
int main()
{
    int nNum,sum,i,loop;
 while(cin>>nNum)
 {
  sum=1;
  for(i=nNum;i>=1;i--)
  {
    sum*=i;
    loop=sum/10;
    while(loop*10==sum)//消0
    {
        sum/=10;
        loop=sum/10;
    }
    if(sum>=100000)//保存末尾5位数字即可
      sum%=100000;
  }
  cout<<sum%10<<endl;
 }
 return 0;
}

http://www.cnblogs.com/jiangjun/articles/2491276.html

【解法三:数论】

 //http://www.cnblogs.com/jiangjun/articles/2491276.html

# include<iostream>
using namespace std;
int main()
{
    unsigned num,n,add,pai[4]={6,2,4,8};
    while(cin>>n)
    {
    num=n;
    add=0;
while(num)
{
        if(num%5==2)
            add+=1;
        else if(num%5==4)
        add+=2;
        add+=num/5;
}
    }
    if(n>1)
    cout<<pai[add%4]<<endl;
    else cout<<1<<endl;
    }
    return 0;
}
 

 

 

 

posted on 2012-05-09 10:20  即为将军  阅读(2067)  评论(0)    收藏  举报

导航