2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
1

Степень

19.07.2021, 14:24. Показов 8105. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Степень
Для того чтобы проверить, как её ученики умеют считать, Мария Ивановна каждый год задаёт им на дом одну и ту же задачу — для заданного натурального A найти минимальное натуральное N такое, что N в степени N (N, умноженное на себя N раз) делится на A. От года к году и от ученика к ученику меняется только число A.

Вы решили помочь будущим поколениям. Для этого вам необходимо написать программу, решающую эту задачу.

Входные данные

Во входных данных содержится единственное число A (1≤A≤10^9 — на всякий случай; вдруг Мария Ивановна задаст большое число, чтобы «завалить» кого-нибудь…).

Выходные данные

Выведите число N.

Примеры
Ввод
1
Вывод
1
Ввод
8
Вывод
4
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2021, 14:24
Ответы с готовыми решениями:

Вычислить 10-ю степень двойки сложением, умножением и просто возведением в степень.
Написать код на С++ или С# или на Java Вычислить 10-ю степень двойки 1 - сложением, умножением и...

Вычислить сумму чисел от 1 до N, возведенных в степень M. Возведение в степень оформить как многократное умножение
Не знаю как это написать.. или объясните пожалуйста или помогите сделать)

Как возвести дробное число в целую степень? К примеру 2,7 возвести в степень 2 на C++.
Как возвести дробное число в целую степень? К примеру 2,7 возвести в степень 2 на C++.

Степень
По заданному числу A определить такие B и С, что A=BC, а C – наибольшее. Входные данные ...

45
18 / 15 / 2
Регистрация: 15.05.2021
Сообщений: 57
21.07.2021, 15:18 21
Author24 — интернет-сервис помощи студентам
с чего ты взял, что я хочу? может я это и не по своей воле!
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
21.07.2021, 15:22 22
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ошибка у вас или у меня? Мой ответ: 333259185
Думаю, что у меня. Похоже, на больших числах переполняется. Надо заменить где-нибудь uint32_t на uint64_t и отслеживать переполнения

Добавлено через 2 минуты
Исправленная версия
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <inttypes.h>
#include <math.h>
#include <string.h>
#include <locale.h>
 
uint32_t divider[100];
uint8_t div_cnt[100] = {0};
uint8_t div_num = 0;
 
uint32_t div_next(uint32_t val, uint32_t st){
  uint32_t max = sqrt(val)+1;
  for(uint32_t i=st; i<max; i+=2)
    if(val % i == 0)return i;
  return val;
}
 
uint32_t add_divider(uint32_t val, uint32_t d){
  if( val % d != 0)return val;
  while( val % d == 0 ){
    div_cnt[div_num]++;
    val /= d;
  }
  divider[div_num] = d;
  div_num++;
  return val;
}
 
uint32_t findpwr(uint32_t val, uint32_t d){
  uint8_t res = 0;
  while(val % d ==0){
    res++;
    val /= d;
  }
  return res;
}
 
uint64_t mult(uint32_t x){
  uint64_t res = 1;
  uint8_t dvd_cnt[100];
  
  //for(uint32_t i=0; i<div_num; i++)dvd_cnt[i] = div_cnt[i];
  memcpy(dvd_cnt, div_cnt, div_num*sizeof(div_cnt[0]));
  
  printf("Test %i\n", x);
  for(uint32_t i=0; i<div_num; i++){
    if(x % divider[i] == 0){
      uint32_t p = findpwr(x, divider[i]);
      if(dvd_cnt[i] % p > 0)dvd_cnt[i] = dvd_cnt[i] / p + 1; else dvd_cnt[i] /= p;
      uint32_t mlt = 1;
      for(uint32_t j=0; j<p; j++)mlt *= divider[i];
      x /= mlt;
      res *= mlt;
    }
    res *= divider[i];
  }
  res *= x;
  
  for(uint32_t i=0; i<div_num; i++){
    if(dvd_cnt[i] > res){printf("\tmlt failed in %i (%i < %i)\n", i, res, dvd_cnt[i]); return 0;}
  }
  printf("\tmlt succ: %i\n", res);
  return res;
}
 
int main(){
  setlocale(LC_ALL, "");
  uint32_t val, d = 3;
  scanf("%"SCNu32, &val);
  val = add_divider(val, 2);
  while(1){
    d = div_next(val, d);
    if(d <3)break;
    val = add_divider(val, d);
  }
  
  for(uint32_t i=0; i<div_num; i++){
    printf("%"PRIu32"\t%"PRIu8"\n", divider[i], div_cnt[i]);
  }
  
  uint64_t min = mult(1);
  if(min == 0){
    for(uint32_t i=2; i<32; i++){
      uint64_t res = mult(i);
      if(res == 0)continue;
      if(res < min)min = res;
    }
  }
  printf("%"PRIu64"\n", min);
}
Добавлено через 1 минуту
Цитата Сообщение от irthgr Посмотреть сообщение
с чего ты взял, что я хочу? может я это и не по своей воле!
А с чего вы взяли что мы тут рвемся решать за двоечников их задачи? Вылетят из школы - туда и дорога.
0
18 / 15 / 2
Регистрация: 15.05.2021
Сообщений: 57
21.07.2021, 16:00 23
я учусь в сириусе (програмированию), там есть отбор но если время вышло, отправить ответ на задачу не выйдет! Я решаю пока есть время, а есл времени нет, то пытаюсь найт!

Добавлено через 8 минут
у меня в четверти только 4-ки и 5-ки!

Добавлено через 7 минут
неужели вы считаете, что каждый человек который просит готовое решение, это двоечник? я не двоечник! я учусь очень даже нормально, но родственникам этого мало, записывают на всякие курсы, потом у меня ни на что не хватает времени, а как только скажу что не хочу, то мне влетит сразу же по первое число!
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
21.07.2021, 16:27 24
Цитата Сообщение от irthgr Посмотреть сообщение
я учусь в сириусе (програмированию), там есть
Не интересует
Цитата Сообщение от irthgr Посмотреть сообщение
неужели вы считаете, что каждый человек который просит готовое решение, это двоечник?
Не обязательно. Может быть просто лентяй и халявщик, который хочет получить решение своей проблемы не прикладывая даже минимальных усилий.
Вот вы что сделали чтобы решить свою задачу? Скопипастили условие на форум и считаете что этого достаточно?
---
Но вам повезло, задача заинтересовала нескольких форумчан и они ее за вас таки решили. И что, где благодарность?
0
18 / 15 / 2
Регистрация: 15.05.2021
Сообщений: 57
21.07.2021, 17:03 25
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не обязательно. Может быть просто лентяй и халявщик, который хочет получить решение своей проблемы не прикладывая даже минимальных усилий.
Вот вы что сделали чтобы решить свою задачу? Скопипастили условие на форум и считаете что этого достаточно?
---
Но вам повезло, задача заинтересовала нескольких форумчан и они ее за вас таки решили. И что, где благодарность?
Во первых - я не копипастил условие, я просто в последний день сдачи решений написал тему в гугл и увидел это, а дальше поинтересовался, вдруг кто то решил! Спасибо, на я не вижу здесь 100% решения на с++! Это не я написал условие!

я вчера до 4 часов ночи не спал чтоб её решить, в итоге у меня получилось на питоне, а на с++ попытался закинул, а там только 12 из 15!

Добавлено через 8 минут
я обычный новичёк форума, который пришол сюда просто посмотреть решение!

и я на этом форуме впервые в жизни спросил "Есть у кого решение на С++?"
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
21.07.2021, 17:48 26
Цитата Сообщение от irthgr Посмотреть сообщение
Спасибо, на я не вижу здесь 100% решения на с++! Это не я написал условие!
Что значит "решение на с++"? Класс написать что-ли, который будет решать задачу, с геттерами и сеттерами? Или унаследоваться обязательно от чего-нибудь? Виртуальные функции?

Добавлено через 7 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Можно попробовать сначала разложить на простые множители с учетом степени - получим минимальное число, которое надо возводить в степень.
А почему это работает? Почему произведение простых множителей (без учёта степени), возведённое само в себя - есть то самое минимальное число, которое делится на исходное без остатка?
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
21.07.2021, 18:06 27
Ладна, дарю. Решение на Qt C++. Оконное приложение. Две кнопки. Левая - вычисляет по алгоритму COKPOWEHEU, внизу простые числа. Правая - перебором возведения в степень самого себя по модулю.

Это С++ или опять не то?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
quint64 st_mod(quint64 a, quint64 b, quint64 m)
{
    quint64 r = 1;
 
    while (b)
    {
        if (b & 1)
        {
            r *= a;
            r %= m;
        }
 
        a *= a;
        a %= m;
        b >>= 1;
    }
 
return r;
}
 
 
 
 
void Widget::press_pbtn_01()
{
    QTime m_time;
    QTime time(0,0,0,0);
 
    quint32 a, k = 0, m = 1;
 
    QString str;
 
    str = ui->lineEdit_01->text();
    a = str.toLongLong();
 
    QList<quint32> list;
 
    //str = ui->lineEdit_02->text();
    //m = str.toLongLong();
 
 
    str.clear();
 
    m_time.start();
 
    //k = 0;
 
 
    // разложение на простые множители
    for(quint32 i = 2; i <= a; i++)
    {
 
        if (a % i == 0)
        {
            if(k != i)
            {
                str += QString::number(i) + " ";
                list << i;
            }
 
            a = a / i;
            k = i;
            i--;
         }
    }
 
    // произведение простых множителей
    for(int j = 0; j < list.length(); j++)
        m *= list.at(j);
 
 
    quint64 msecs = m_time.elapsed();
 
    ui->label_01->setText(QString::number(m));
    ui->label_02->setText(str);
    ui->label_03->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
}
 
 
 
 
void Widget::press_pbtn_02()
{
    QTime m_time;
    QTime time(0,0,0,0);
 
    quint64 a, b;
 
    ui->label_06->setText("Please wait");
    ui->label_07->setText("Please wait");
    QApplication::processEvents();
 
    QString str = ui->lineEdit_01->text();
    a = str.toLongLong();
 
    b = 2 - a % 2;
 
 
    m_time.start();
 
    while(st_mod(b, b, a))
    {
        b += 2;
    }
 
    quint64 msecs = m_time.elapsed();
 
 
    ui->label_06->setText(QString::number(b));
    ui->label_07->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
 
}
Миниатюры
Степень  
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
21.07.2021, 19:38 28
Цитата Сообщение от alexu_007 Посмотреть сообщение
А почему это работает? Почему произведение простых множителей (без учёта степени), возведённое само в себя - есть то самое минимальное число, которое делится на исходное без остатка?
Потому что мы каждый множитель возводим в степень целого числа. То есть для исходного числа 3888 = 24*35 получаем 2*3 = 6. Соответственно NN = 26*36. Очевидно, что 26 делится на 24, а 36 - на 35. То есть мы пользуемся тем, что произведение сомножителей (число, в степень которого возводим) обычно оказывается больше максимальной степени.
Проблема в числах, равным степеням вроде 65536 = 216, здесь произведение множителей нужно на что-то умножать дополнительно. Для этого у меня в конце цикл от 2 до 20 с перебором.
Вопроы "на подумать":
1. Количество сомножителей у меня ограничено 100 (на самом деле можно раза в 3 меньше) - почему именно столько?
2. Максимальное число, на которое умножается минимальное число в конце у меня равно 20 - какое оно должно быть минимально?
1
18 / 15 / 2
Регистрация: 15.05.2021
Сообщений: 57
21.07.2021, 22:18 29
Цитата Сообщение от alexu_007 Посмотреть сообщение
Это С++ или опять не то?
Ну это не совсем С++. То-есть это не будет работать если кинешь его на проверку под С++!

Добавлено через 22 минуты
https://www.youtube.com/watch?... e=emb_logo
это видео урок по решению задачи, я именно по нему делал, но не смог программа моя проходит 10 из 15 тестов(проверял на сайте informatics.mccme.ru) есть у кого рабочий код на С++?
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
21.07.2021, 22:48 30
Цитата Сообщение от irthgr Посмотреть сообщение
учусь в сириусе (програмированию)
Функции вызывать не умеешь?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
 
int foo(int num)
{
    //=============================
    for(int n = 1; n <= 30; ++n)
    {
        int temp = num;
        for(int i = 0; i < n; ++i)
        {
            temp /= std::gcd(n, temp);
        }
        if(temp == 1) return n;
    }
    //=============================
 
    std::map<int, int> divpow;
    auto divid = [&num, &divpow](int val)
    {
        while(!(num % val))
        {
            ++divpow[val];
            num /= val;
        }
    };
 
    divid(2);
    for(int i = 3, e = sqrt(num) + 1; i <= e; i += 2) divid(i);
 
    if(divpow.empty()) return num;
 
    if(num > 1) ++divpow[num];
    int result = std::accumulate(divpow.begin(), divpow.end(), 1, [](int a, const auto& b) { return a * b.first; });
    int maxpow = std::max_element(divpow.begin(), divpow.end(), [](const auto& a, const auto& b) { return a.second < b.second; })->second;
 
    result *= (maxpow / result + ((maxpow % result) > 0));
    return result;
}
 
int main()
{
    int x;
    std::cin >> x;
    std::cout << foo(x);
 
    return 0;
}


Цитата Сообщение от irthgr Посмотреть сообщение
проверял на сайте informatics.mccme.ru
Кинь сцылку, чтот я её там не нахожу.

Не по теме:


Цитата Сообщение от irthgr Посмотреть сообщение
в итоге у меня получилось на питоне
У тебя? Сдаётся мне, Геральт, ты... как бы это помягче сказать...
Куча решений этой задачи на питоне в тырнете плавает.
Цитата Сообщение от irthgr Посмотреть сообщение
я учусь в сириусе (програмированию), там есть отбор но если время вышло, отправить ответ на задачу не выйдет! Я решаю пока есть время, а есл времени нет, то пытаюсь найт!
Добавлено через 8 минут
у меня в четверти только 4-ки и 5-ки!
Добавлено через 7 минут
неужели вы считаете, что каждый человек который просит готовое решение, это двоечник? я не двоечник! я учусь очень даже нормально, но родственникам этого мало, записывают на всякие курсы, потом у меня ни на что не хватает времени, а как только скажу что не хочу, то мне влетит сразу же по первое число!
Это так жалко выглядит.
"Я не халявщик, я честный молодец! Поэтому, не справившись с задачей, буду читерить, чтобы обойти честных лохов! Вот такой я молодец!"
Л - логика!
Мож и "4-ки и 5-ки" у тебя такие же, мнимые?
Ну да пофиг. Вот смеху будет, если попросят объяснить код АХХАХАА!!

0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
22.07.2021, 09:38 31
Цитата Сообщение от irthgr Посмотреть сообщение
Ну это не совсем С++. То-есть это не будет работать если кинешь его на проверку под С++!
Не будет работать, потому что там (в том коде, что я выложил) есть логические ошибки - не учитываются числа с маленьким произведением простых множителей.

Код на чистом Си прекрасно работает и в С++, там возможно другие требования по вводу-выводу чисел?
0
18 / 15 / 2
Регистрация: 15.05.2021
Сообщений: 57
22.07.2021, 10:29 32
Цитата Сообщение от Folian Посмотреть сообщение
Функции вызывать не умеешь?
у меня не распознаётся такая функция как std::gcd в с++!
но не в этом дело, я нашёл в иете функцию этого гцд, всё начало кумекать, но когда начинаю проверять пишу 8, а он в ответ конец проверки и какие то ошибки!
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
22.07.2021, 12:57 33
Цитата Сообщение от irthgr Посмотреть сообщение
у меня не распознаётся такая функция как std::gcd в с++!
Это C++17
Цитата Сообщение от irthgr Посмотреть сообщение
но не в этом дело, я нашёл в иете функцию этого гцд, всё начало кумекать, но когда начинаю проверять пишу 8, а он в ответ конец проверки и какие то ошибки!
код показывай, телепаты в отпуске.
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
22.07.2021, 13:00 34
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Исправленная версия
Чтот min из нуля не вылезает обратно :
Изображения
 
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
22.07.2021, 13:12 35
Цитата Сообщение от Folian Посмотреть сообщение
Чтот min из нуля не вылезает обратно
Лень уже переделывать по-нормальному, так что обойдемся костылем:
C
1
2
3
4
5
6
7
8
9
uint64_t min = mult(1);
  if(min == 0){
    min = 0xFFFFFFFFFFFFFFFF;
    for(uint32_t i=2; i<32; i++){
      uint64_t res = mult(i);
      if(res == 0)continue;
      if(res < min)min = res;
    }
  }
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
22.07.2021, 13:24 36
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
обойдемся костылем
Хм...
Злая задача.
Изображения
 
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
22.07.2021, 15:40 37
Новая порция костылей:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uint64_t mult(uint32_t x){
  uint64_t res = 1;
  uint8_t dvd_cnt[100];
  
  memcpy(dvd_cnt, div_cnt, div_num*sizeof(div_cnt[0]));
  
  printf("Test %i\n", x);
  for(uint32_t i=0; i<div_num; i++){
    if(x % divider[i] == 0){
      uint32_t p = findpwr(x, divider[i]);
 //Изменено вот тут
      if(dvd_cnt[i] % (p+1) > 0)dvd_cnt[i] = dvd_cnt[i] / (p+1) + 1; else dvd_cnt[i] /= (p+1); 
      uint32_t mlt = 1;
      for(uint32_t j=0; j<p; j++)mlt *= divider[i];
      x /= mlt;
      res *= mlt;
    }
    res *= divider[i];
  }
  res *= x;
  
  for(uint32_t i=0; i<div_num; i++){
    if(dvd_cnt[i] > res){printf("\tmlt failed in %i (%i < %i)\n", i, res, dvd_cnt[i]); return 0;}
  }
  printf("\tmlt succ: %i\n", res);
  return res;
}
1
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
22.07.2021, 17:15 38
Цитата Сообщение от Folian Посмотреть сообщение
Злая задача.
А чё это за циферки непонятные?
И код непонятный.

Я пошёл по простому пути.

- разложил число на простые сомножители, так что всех сомножителей по одному. Т.е. из 2 2 3 5 5 7 у меня остаётся 2 3 5 7
- перемножил получившиеся числа - получил некое число Х, для которого:

22 = 4
33 = 9
...
99 = 387 420 489
1010 и далее - выходит за пределы задачи

Поэтому если X < 10 - решается перебором вариантов (на маленьких числах находится мгновенно),
Если X >= 10 - оно и является результатом
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
22.07.2021, 18:56 39
Цитата Сообщение от alexu_007 Посмотреть сообщение
А чё это за циферки непонятные?
Показывают расхождение результатов моего и COKPOWEHEU

Цитата Сообщение от alexu_007 Посмотреть сообщение
И код непонятный.
В первом куске перебором делим число на НОД с предполагаемым ответом n эти самые n раз, эт как сокращение дроби получается, т.е., если после такогго сокращения в знаменателе единица - ответ найден. Эта штука ловит числа типа Xy, попутно отлавливая и другие числа, но это побочка.

А далее факторизация, перемножение множителей и домножение, если необходимо, чтоб результат был >=, нежели степень множителя с крупнейшей степенью (new achievement: тавтолог).
0
818 / 621 / 321
Регистрация: 24.02.2017
Сообщений: 2,199
23.07.2021, 01:20 40
Добавлено через 10 минут
del
0
23.07.2021, 01:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2021, 01:20
Помогаю со студенческими работами здесь

Степень
Хочу реализовать 2 в 3 степени .. но не могу докумекать как это сделать .. Каким циклом сделать...

степень
создать класс для вычисления числа n в степени k, перегрузить оператор * умножения. помогите...

Возведение в степень!
Определить {\chi }^{15} без использования функций и не более чем 5-ю арифметическими операциями.

Возведение в степень
Здравствуйте, нужно возвести константу &quot;e&quot; в степень -x-2, может кто-нибудь подскажет как это...

Степень числа
Приветы всем! Пытаюсь сделать задания, но не могу разобраться как всё посчитать... Суть в том что...

Возведение в степень C++
Нужно возвести число в 16 степень, используя минимальное количество операторов и переменных и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru