Помощ за една програма на C++

Последно мнение 04-13-2010 12:36 от hristov_b. 6 отговори.
Страница 1 от 1 (7 обекта)
Сортиране на постовете: Предишна тема Следваща тема
  • 03-11-2010 21:24

    • imho
    • Топ 100 за потребители
      Мъж
    • Регистриран на 09-10-2007
    • Мнения 38
    • Точки 675

    Помощ за една програма на C++

    Става дума за задача "Нули" от Арена 2 , бронзовата дивизия, http://cs.maycamp.com .

    Програмата трябва да намери по число N<50000 броя на нулите, с които завършва произведението на числата от 1 до N и последната му ненулева цифра.

    Например за N=12 произведението е 479001600, има две завършващи нули и последната ненулева цифра е 6.

    Ето моментното ми решение.
        #include<iostream>
    using namespace std;

    int main() {
    int n, i, t, c2, c5, p;
    c2 = 0;
    c5 = 0;
    p = 1;
    cin >> n;
    for (i = 2; i <= n; i++) {
    t = i;
    while (!(t % 5)) {
    t /= 5;
    c5++;
    }
    while (!(t % 2)) {
    t /= 2;
    c2++;
    }
    p *= t;
    p %= 10;
    }
    for (i=0;i<c2-c5;i++){
    p*=2;
    p%=10;
    }
    cout << p << ' ' << c5 << endl;
    }

    Предложете нещо по-оптимизирано..
    • Точки: 20
  • 03-17-2010 10:17 в отговор на

    • hristov_b
    • Топ 50 за потребители
      Мъж
    • Регистриран на 10-18-2007
    • Мнения 82
    • Точки 1 605

    За: Помощ за една програма на C++

    int main()
    {int n,c0=0;
     long long p=1;
        cout<<"n=";cin>>n;
        for(int i=2;i<=n;i++)
        {p=p*i;
         while((p%10)==0){p=p/10;c0++;}
         p=p%1000000;
        }
        cout<<p%10<<" "<<c0;       
        system("PAUSE");
      
    }
    Бележка: През цялото време се работи само с последните 6 цифри на n! (p=p%1000000)- този брой се определя от ограничението за входа n<50000.

    След всяко едно умножвние се отстраняван появилите се нули, като техния брой се помни в c0.

    • Точки: 20
  • 03-17-2010 18:32 в отговор на

    • imho
    • Топ 100 за потребители
      Мъж
    • Регистриран на 09-10-2007
    • Мнения 38
    • Точки 675

    За: Помощ за една програма на C++

    Благодаря! Вярно, long long е бая дълго число!

    Да попитам и още нещо...

    Направил съм масив от char a[11][11] и искам да прочета от стандартен вход таблица rxc реда, например позиция на шахматна дъска, таблица от буквички...без интервали между тях.

    Нещо подобно

    OOOOOOOO
    OOXOXOOO
    OXOOOXOO
    OOOHOOOO
    OXOOOXOO
    OOXOXOOO
    OOOOOOOO
    OOOOOOOO

    Обаче това не е всичко. Не искам да започна да ги записвам от елемента [0][0], а от [1][1] или [2][2] а предните редове и стълбове да останат '\0'.

    Ето нещо такова би работило, но търся най-добрия и бърз вариант:

        //r=rows, c=columns
    cin.ignore(15, '\n');
    for (i = 1; i <= r; i++) {
    for (j = 1; j <= c; j++)
    cin.get(a[ i][j]);
    cin.ignore(15, '\n');
    }

    Няма значение дали е с iostream или stdio.

    • Точки: 20
  • 03-20-2010 18:26 в отговор на

    • hristov_b
    • Топ 50 за потребители
      Мъж
    • Регистриран на 10-18-2007
    • Мнения 82
    • Точки 1 605

    За: Помощ за една програма на C++

       В хедър файла conio.h има функция getch(), чрез която се въвежда символ по символ без да е необходимо да се натиска <Enter>     

         int r=3,c=4;
      char a[11][11]; 
      for (int i = 1; i <= r; i++)
        {for (int j = 1; j <= c; j++)aIdea[j]=getche();
         cout<<endl;
        }           
      

     

    • Точки: 20
  • 03-20-2010 23:51 в отговор на

    • imho
    • Топ 100 за потребители
      Мъж
    • Регистриран на 09-10-2007
    • Мнения 38
    • Точки 675

    За: Помощ за една програма на C++

    Да, явно че така ще е... То моето е същото, ама с iostream.

    • Точки: 5
  • 04-06-2010 18:41 в отговор на

    • imho
    • Топ 100 за потребители
      Мъж
    • Регистриран на 09-10-2007
    • Мнения 38
    • Точки 675

    За: Помощ за една програма на C++

    Стигнах до един умопомрачителен извод. Нищо не пречи клетките с нули да ги оставям вместо в началото на този ред в края на предния, като с това си спестявам перипетиите по входа. Поне моят компилатор не прави проблеми с индекси от сорта на b[2][-2]. Въпросът е дали с всички компилатори ще е така.
    • Точки: 20
  • 04-13-2010 12:36 в отговор на

    • hristov_b
    • Топ 50 за потребители
      Мъж
    • Регистриран на 10-18-2007
    • Мнения 82
    • Точки 1 605

    За: Помощ за една програма на C++

    imho:
    умопомрачителен извод.

         Нещата са естествени, слад като се прочете темата "Указатели и масиви" от учебника на Магдалина Тодорова " Програмиране на С++ - Първа част".

        Елементите и на двумерните масиви се разполагат последователно в паметта  ( по редове) и достъпът до тях може да се осигури по различни начини - по бързия начин е чрез указатели, а по - разбираемия е чрез индекси.

        В повечето компилатори автоматично не се осигурява проверка на стойностите на индексите на масивите - то се прави опционално, с допълнително избиране / неизбиране  на съответната възможност. 

    • Точки: 5
Страница 1 от 1 (7 обекта)
www.teacher.bg 2007 - 2008