我正在尝试为SPOJ阶乘问题编号11开发代码。以下是我的代码
import java.math.*;
import java.io.*;
public class Problem11 {
/**
* Count the number of zeroes at the end of
* the factorial value of a number.
*/
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int numOfInputs=0;
numOfInputs=Integer.parseInt(br.readLine());
BigInteger nextNum[]=new BigInteger[numOfInputs];
BigInteger factValue[]=new BigInteger[numOfInputs];
//Get all the numbers to be computed
for(int count=0;count<numOfInputs;count++)
{
nextNum[count]=new BigInteger(br.readLine());
}
//Obtain the factorial value for each number
for(int count=0;count<numOfInputs;count++)
{
factValue[count]=getFact(nextNum[count]);
}
//Obtain the number of trailing zeroes
for(int count=0;count<numOfInputs;count++)
{
//System.out.println(factValue[count]);
System.out.println(getZeroes(factValue[count]));
}
}
public static String getZeroes(BigInteger num)
{
int numOfZeroes=0;
while(num.remainder(BigInteger.TEN).equals(BigInteger.ZERO))
{
num=num.divide(BigInteger.TEN);
numOfZeroes++;
}
return String.valueOf(numOfZeroes);
}
public static BigInteger getFact(BigInteger num)
{
BigInteger factorial=BigInteger.ONE;
if(num.equals(0))
{
return (BigInteger.valueOf(1));
}
else
{
int count=1;
while((BigInteger.valueOf(count).compareTo(num))<=0)
{
factorial=factorial.multiply(BigInteger.valueOf(count));
count++;
}
}
return factorial;
}
}
该代码适用于最多5位数的小延迟和最后一个数字
8735373
这花费了太多时间,如果我提交我的解决方案,法官会显示编译错误。我无法弄清楚错误是什么。请查看我的代码并帮助我跟踪问题。
答案 0 :(得分:4)
您可以查看此方法以查找the number of trailing zeros in n!。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int count = in.nextInt();
for (int i = 0; i < count; i++) {
int n = in.nextInt();
int result = 0;
for (int d = 5; d <= n; d *= 5) {
result += n / d;
}
System.out.println(result);
}
}
}
答案 1 :(得分:2)
您的方法(天真:计算实际因子值然后手动计算零)无论如何都不会通过。看看极端情况(即阶乘的上限,我甚至不认为给定的内存限制足以计算它)。从不同的方式看问题,思考真正的问题是什么,这是解决问题的艺术;)
提示:什么可以产生并在数字的末尾添加更多的0,特别是通过乘法?
答案 2 :(得分:0)
您的错误原因应该是public class Main
此外,您的代码将获得TLE,您必须注意到暴力在SPOJ上永远不会起作用。解决这个问题的方法是看到一个有趣的模式,其权力为5,最后为零的数量。
答案 3 :(得分:0)
这是C中的解决方案。我们不需要计算此问题的确切因子。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000000
int xpn(int x, int n){
int prod=1;
while(n){
prod*=x;
n--;
}
return prod;
}
int trail(int x){
int numZero=0;
int i=1;
int k;
for(;x/xpn(5,i);i++){
numZero+=(x/xpn(5,i));
}
return numZero;
}
int main(int argc, char **argv){
#if 1
int n;
int num[MAX];
int zero[MAX];
scanf("%d",&n);
int count=n;
int i=0;
while(count){
scanf("%d",&num[i]);
zero[i]=trail(num[i]);
printf("%d\n",zero[i]);
i++;
count--;
}
#endif
return 0;
}
答案 4 :(得分:0)
import java.util.*;
import java.lang.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
Scanner s = new Scanner(System.in);
int t = s.nextInt();
while (t-->0){
int n = s.nextInt();
int count = 0;
while(n>0){
count +=n/5;
n/=5;
}
System.out.println(count);
}
}
}
此解决方案绝对可以正常工作。 让我解释一下。 当您提及定量能力时,有一个简短的公式可以计算任何阶乘数的尾随零。将数字直接除以5,开始加商,然后将商除以5,再加一次,直到该值开始给出常数商。请参考以下示例。如果您什至不了解,请参考任何来源的定量能力。
例如
1. 60! 60/5 = 12, 12/5 = 2, add all the quotient i.e equals to 14.
2. 500! 500/5 = 100, 100/5 = 20, 20/5 = 4, ans = 124.