2013-08-22 5 views
1

Я дал это решение в кодеке для кода проблемы: FCTRL.Сокращение времени в следующем коде

Я видел время компиляции других людей, использующих один и тот же язык с (я использую C++ GCC 4.8.1) несколько меньше, шахта 0.46s в то время как их это 0,23

Может кто-нибудь помочь мне в сократить время, если это возможно?

#include<iostream> 
using namespace std; 
int main() 
{ 
    long int t,i,temp; 
    cin>>t; 
    long int n[t],a[t]; 
    for(i=0;i<t;i++) 
    { 
     temp=1; 
     a[i]=0; 
     cin>>n[i]; 
     while(temp) 
     { 
      temp=n[i]/5; 
      a[i]+=temp; 
      n[i]=n[i]/5; 
     } 
    } 
    for(i=0;i<t;i++) 
    cout<<a[i]<<"\n"; 

    return(0); 
} 
+0

Я незнаком с codechef, почему вопрос компиляции имеет значение? – orlp

+0

Дело не в этом, но я хотел просто знать, могу ли я сократить время выполнения этой программы. –

+0

А также, если я использую больше переменных, чем требуется, и тому подобное. –

ответ

1

Из вашего описания, как вы используете C++ и они используют с, это может быть связано с тем, как компилятор обрабатывает каждую команду.

Также вы можете попробовать заменить

temp=n[i]/5; 
a[i]+=temp; 
n[i]=n[i]/5; 

По

temp=n[i]/5; 
a[i]+=temp; 
n[i]=temp; //why compute the value again 

И увидеть, если какое-то время уменьшает или не

+0

Интересно, я бы ожидал, что компилятор оптимизирует это (Common Sub Expression Elimination), однако я задаюсь вопросом, может ли быть потенциальная проблема псевдонимов: если компилятор не может доказать, что 'a [i]' и 'n [i]' отличаются друг от друга, тогда он не может устранить подвыражение, и, следовательно, ваша оптимизация может иметь значение. –

+0

@ MatthieuM. спасибо за ваш вклад. – Saksham

+0

Ну, это уменьшило его до 0,43 секунды. Так что спасибо. –

0

Вы худшее правонарушение C++ используете VARIADIC-Length массивы, те неэталоны.

И в самом деле, оказывается, вы абсолютно им не нужны. Эта проблема может быть решена на основе строки, поэтому использование массивов для ввода и вывода бесполезно.

Вот ваша программа, упрощенная. Я также отметил, что temp бесполезен в цикле (хотя, вероятно, он оптимизирован, он загрязнил код).

#include <iostream> 

int main() 
{ 
    size_t number = 0; 
    std::cin >> number; 

    for(size_t i = 0 ; i < number; ++i) 
    { 
     size_t a = 0, n = 0; 

     std::cin >> n; 

     while (n) 
     { 
      n /= 5; 
      a += n; 
     } 

     std::cout << a << '\n'; 
    } 
} 

Возможно ли это сделать лучше? О да! Основные проблемы здесь в том, что the C++ streams are none too fast, чтобы вы могли получить хороший импульс, переключившись на методы чтения С ... однако они не так хороши (и безопасны).

+0

Итак, получается, что просто использование scanf и printf сократило время до 0,2 секунды. Благодарю вас. –

+0

@LakshayChhikara: Не удивлены здесь, потоки ввода-вывода не подчиняются духу C++ *, вы не платите за то, что вам не нужно *. –

+0

Еще раз спасибо за вашу помощь. –

Смежные вопросы