C++ FCTRL代码太慢

C++ FCTRL代码太慢,c++,C++,对于阶乘问题,我在code chef中的cpp代码有一些问题。 我不断收到一个错误,告诉我它太慢了,我想知道是否有什么方法可以加快它 #include <iostream> using namespace std; int Divisible_by_5(long &number) { long hold = 0; int result = 0; if(number % 5 == 0) { result++; hold = num

对于阶乘问题,我在code chef中的cpp代码有一些问题。 我不断收到一个错误,告诉我它太慢了,我想知道是否有什么方法可以加快它

#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;

}
#包括
使用名称空间std;
可整除的整数被5整除(长&数)
{
长持有=0;
int结果=0;
如果(数字%5==0)
{
结果++;
保持=数字/5;
while(保持%5==0)
{
结果++;
保持=保持/5;
}
}
返回结果;
}
整数阶乘展开(长&数)
{
int结果=0;
而(数量>4)
{
结果+=可被_除以_5(数字);
数字--;
}
返回结果;
}
int main()
{
ios_base::与_stdio同步(false);
int*p_结果_数组;
内线;
cin>>行;
p_结果_数组=新整数[行];
对于(int i=0;i>输入;
p_结果_数组[i]=阶乘_展开(输入);
}
对于(int i=0;i你可以做几件事来加快速度

第一,在
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]);
    }
最后,知道10,11,12,13,14的答案与10的答案相同,你可以即兴使用
Factorial_展开法
。第一步,你需要找出你比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;
}

我很想知道你是什么时候出错的。

你从哪里得到这个错误的?我在向codechef提交代码后得到了这个错误。站点会计算执行所需的时间,而这个特定问题有8秒的时间限制。谢谢你的回复。我记下了你建议的更改。FivePower映射实际上降低了我的lo上的执行速度cal machine,我决定将其删除。我仍然无法在codechefs时间限制下将其删除,但我想我将从头开始,尝试其他方法。@Maurice映射的性能降低了多少?您可以尝试使用
map::iterator it=fivepowers.find重新编写它(保留);
并将其用于测试和访问,从而避免重复搜索;它是否提高了性能?
#include <map>
map<long, long> fivepowers;
// and later, to check or set with known answers
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;
}
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;
}