Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 14:37   #11
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

мне нужно само значение i^c, а не по отдельности
akademochka вне форума Ответить с цитированием
Старый 22.03.2013, 15:40   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

akademochka, это не серьёзно.. Вам разжевали и в рот положили, а Вы проглотить не можете?!

Хорошо. давайте так. Вы вводите число. Вам программа сообщает о простых множителях и степени, в которую их нужно возвести (Pi и ai)
Что не так? Что Вы хотели бы получить?!
приведите пример.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2013, 16:45   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
for(int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
        int c = 1;
        while(x % i == 0) {
            x /= i;
            c *= i;
        }
        cout << c << endl;
    }
}
Основная идея такая, но может выдавать не совсем полный ответ.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.03.2013, 18:16   #14
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

я уже написала, что это долго

Задача стоит так: просуммировать вот эти p^a.
Код:
int Sum=0;
for(int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
        int c = 1;
        while(x % i == 0) {
            x /= i;
            c *= i;
        }
       Sum+=c;
    } 
}
если так, то работает не правильно

Последний раз редактировалось Stilet; 23.03.2013 в 12:19.
akademochka вне форума Ответить с цитированием
Старый 22.03.2013, 19:00   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Задача стоит так: просуммировать вот эти p^a.
С этого нужно было начинать тему
Сага о X, Y и Z...
Цитата:
если так, то работает не правильно
У меня не было возможности проверить на компьютере, но подозрения, что не будет работать, были.
Если последний делитель х имеет кратность 1, то он не учитывался.
Код:
int Sum = 0;
for (int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
        int c = 1;
        while(x % i == 0) {
            x /= i;
            c *= i;
        }
        Sum += c;
    } 
}
if (x != 1)
    Sum += x;
Возможно, более быстрый вариант:
Код:
int c = 1;
while (x % 2 == 0) {
        x /= 2;
        c *= 2;
}
int Sum = (c > 1) ? c : 0;
for (int i = 3; i * i <= x; i += 2) {
    c = 1;
    while (x % i == 0) {
        x /= i;
        c *= i;
    }
    Sum += (c > 1) ? c : 0;
} 
Sum += (x > 1) ? x : 0;
Цитата:
респект, снимаю шляпу
Я только исправил чуть код, представленный ТС, но, к сожалению, не являюсь автором идеи
(хотя, есть вероятность, что потратив некоторое время, пришел бы к такой идее, но не будем загадывать)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.03.2013 в 19:10.
BDA вне форума Ответить с цитированием
Старый 22.03.2013, 19:07   #16
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

СПАСИБО большое!!!! Наконец-то! Но как сделать, чтобы было чуточку быстрее, а то на одном с тестов time limit

одинаково по времени работает

Последний раз редактировалось Stilet; 23.03.2013 в 12:22.
akademochka вне форума Ответить с цитированием
Старый 22.03.2013, 19:16   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вы можете привести таблицу выполнения программы (картинкой будет удобно)?
На сколько время превышает допустимое?

ПС Дописывайте свое последнее сообщение, а не пишите подряд несколько.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.03.2013, 19:19   #18
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

таблицу выполнения программы? Тесты? Я не знаю какие именно числа задаются в тестах, НО
Среднее время выполнения: 0.109 секунды
Максимальное время выполнения: 1.015 секунды из 1 секунда, 101.5%
akademochka вне форума Ответить с цитированием
Старый 22.03.2013, 19:29   #19
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Ох, как близко.
Код:
int c, i;
for (c = 1, i = 2; !(x % i); x /= i, c *= i) {}
int Sum = (c > 1) ? c : 0;
for(int i = 3; i * i <= x; i += 2) {
    for (c = 1; !(x % i); x /= i, c *= i) {}
    Sum += (c > 1) ? c : 0;
} 
Sum += (x > 1) ? x : 0;
Попробуйте такой вариант - вдруг хватит.
Или придется думать над более радикальным ускорением (пока такого "не придумалось").
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.03.2013, 19:38   #20
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

Так же работает.
Но вообще-то задача стоит еще немного по другому: http://www.e-olimp.com/problems/1246
Код:
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int x,b,f,c; 
    int r=0;
	while (scanf("%d",&x),x){
          r++;

 f=x;
 if(f==1)printf("Case %d: %d\n",r,2);

int c, i;
for (c = 1, i = 2; !(x % i); x /= i, c *= i) {}
int Sum = (c > 1) ? c : 0;
for(int i = 3; i * i <= x; i += 2) {
    for (c = 1; !(x % i); x /= i, c *= i) {}
    Sum += (c > 1) ? c : 0;
} 
Sum += (x > 1) ? x : 0;

if((Sum==f)&&(f!=1)) {Sum++;
printf("Case %d: %d\n",r,Sum);}
else if(f!=1)
{printf("Case %d: %d\n",r,Sum);}
}
    system("PAUSE");
    return EXIT_SUCCESS;
}

Последний раз редактировалось akademochka; 22.03.2013 в 19:40.
akademochka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ЦИКЛЫ (паскаль) - представить N в виде суммы факториалов натуральных чисел, содержащей наименьшее число слагаемых Katya20 Помощь студентам 7 09.01.2012 01:21
Можно ли число N представить в виде сумы двух квадратов натуральных чисел? Dima170792 Помощь студентам 2 24.06.2011 08:53
всякое целое число можно представить в виде трех простых stasey91 Помощь студентам 3 14.04.2011 21:44
Дано натуральное число n. Можно ли представить его в виде суммы двух квадратов натуральных чисел? Сеня Помощь студентам 3 29.01.2009 01:17