FCTRL代码厨师太慢了

时间:2015-07-08 01:07:19

标签: c++

我在代码厨师中遇到了一些关于阶乘问题的cpp代码的问题。 http://www.codechef.com/problems/FCTRL 我一直收到一个错误,告诉我它太慢了,我想知道是否有办法加快速度?

#include <iostream>

using namespace std;

int Divisible_by_5(long &number)
{
  long hold = 0;
  int result = 0;
  if(number % 5 == 0)
    {
      result++;
      hold = number/5;
      while(hold % 5 == 0)
        {
          result++;
          hold = hold/5;
        }
    }
return result;
}

int Factorial_expansion(long &number)
{
  int result = 0;
  while(number > 4)
    {
      result += Divisible_by_5(number);
      number--;
    }
  return result;
}

int main()
{
  ios_base::sync_with_stdio(false);

  int *p_results_array;

  int lines;
  cin >> lines;

  p_results_array = new int [lines];

  for(int i = 0; i < lines; i++)
    {
      long input;
      cin >> input;

      p_results_array[i] = Factorial_expansion(input);
    }
  for(int i = 0; i < lines; i++)
   {
      cout << p_results_array[i] << endl;
    }

 return 0;

}

EDIT 我最终修改了所有内容,结果证明我的数学能够更好。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
  int lines;
  cin >> lines;

  while (lines--)
    {
      long input;
      cin >> input;

      int result = 0;

      for (int i = 1; pow(5, i) <= input; i++)
        result += input/pow(5, i);

      cout << result << endl;
   }

  return 0;
}

1 个答案:

答案 0 :(得分:0)

你可以做几件事来加快速度。 HTH。

main中的一个独立的处理输入。然后你可以计算你的算法,而不是你的打字速度。像

这样的东西
   for(int i = 0; i < lines; i++) {
      long input;
      cin >> input;
      p_results_array[i] = input;
    }
   for(int i = 0; i < lines; i++) {
      p_results_array[i] = Factorial_expansion( (long) p_results_array[i]);
    }

二,保留你已经获得的地图,这样你就不必重新进行计算,例如

#include <map>
map<long, long> fivepowers;
// and later, to check or set with known answers

您的Divisible_by_5现在可以增强,有点像 - 并注意到我更改了const long&的输入类型,以便保留功能界面

int Divisible_by_5(const long &number)
{
  long hold = number;
  int result = 0;
      while(hold % 5 == 0 )
        {
          result++;
          hold = hold/5;
          if ( fivepowers.find(hold) != fivepowers.end() ) return fivepowers[hold] + result;
        }
  fivepowers[number] = result;
  return result;
}

最后,你可以即兴表达Factorial_expansion知道10,11,12,13,14的答案与10的答案相同。对于第一遍,你需要找出前面的数字。你是5X,并将下一个数字精确到5X。此后,减少5,而不是1.因此,一些数学和一些编程。

int Factorial_expansion(const long &number)
{
  long hold = number;
  int result = 0;
  int adjuster = number % 5;
  if ( adjuster == 0 ) adjuster = 5; // else you double-count sometimes
  while(hold > 4)
    {
      result += Divisible_by_5(hold);
      hold -= adjuster;
      adjuster = 5;
    }
  return result;
}

我很想知道你得到什么时间。