C++ FCTRL代码太慢
对于阶乘问题,我在code chef中的cpp代码有一些问题。 我不断收到一个错误,告诉我它太慢了,我想知道是否有什么方法可以加快它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
#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;
}