2011-02-08 3 views
1

Я делаю эту проблему: http://www.codechef.com/problems/FCTRL У меня есть решение, но использование памяти составляет 1,6 МБ, что, судя по всему, слишком велико. Я не понимаю, как я могу уменьшить это, увидев, что у меня почти нет постоянных данных. Вот мой код:Уменьшение использования памяти, C, CodeChef

#include <stdio.h> 
#include <math.h> 


int maxPower(long x) { 
     int i; 
     for(i = 0; i<= 100; i++) { 
       long myPower = pow(5,i); 
       if(myPower > x) { 
         return (i-1); 
       } 
     } 
} 

int main (void) { 
     int lines; 

     scanf("%d", &lines); 

     int i; 
     for(i = 0; i<lines; i++) { 
       long temp; 
       scanf("%ld", &temp); 
       int five_counter = 0; 
       int myPower = maxPower(temp); 
       int power; 
       for(power = 1; power<=myPower; power++) { 
         five_counter += floor(temp/((int)(pow(5,power)))); 
       } 

       printf("%d\n", five_counter); 
       five_counter = 0; 
     } 
} 

Как вы можете видеть, его написано на C. Любые идеи о том, как уменьшить использование памяти?

+0

Возможно, я ошибаюсь в этом, но разве это имеет значение, если вы перемещаете объявления переменных вне петель? – WildCrustacean

+0

Они попадают в стек, а затем вылетают в начале и в конце каждой итерации. Это может заставить его «выполнять медленнее», но не увеличит или не уменьшит использование памяти. – Marlon

+0

@Marlon: Спасибо, что разъяснил это. – WildCrustacean

ответ

0

Это то, что я представил, и он был принят

#include<stdio.h> 
int main() 
{ 
long n,q=0,t,c=1,result,z,m=5; 
scanf("%ld",&t); 
while(c<=t) 
{ 
scanf("%ld",&n); 
z=0; 
while(n!=0) 
{ 
q=n/m; 
z=z+q; 
n=q; 
} 
printf("%ld\n",z); 
c++; 
} 
return 0; 
} 

Основная логика в том, что нет нулей в конце факториала является высокой мощностью 5, которая делит число.

-1

Какая часть 1,6 МБ является общей памятью? Сколько мест для вашего процесса? Просто начав процесс, связанный со стандартной библиотекой C, вы будете использовать определенное количество памяти, даже если вся ваша программа:

int main(int argc, char *argv[]) { 
    return 0; 
} 

Где вы видите на 1.6Mb фигуру?

+0

В кодеках моих представлений. Это не позволяет мне получить правильный ответ, потому что он дает мне Runtime Error (я на 100% уверен, что не делю на 0) –

+0

@Jeremiah: Алгоритм правилен, более или менее, он просто излишне сложный и неэффективный , –

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