我在代码厨师中遇到了一些关于阶乘问题的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;
}
答案 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;
}
我很想知道你得到什么时间。