Najmniejszy dzielnik

0

Niech f(x) oznacza najmniejszy taki dzielnik x, że f(x) > 1. Twoim zadaniem jest policzyć następującą sumę:
f(2) + f(3) + . . . + f(n)
dla podanego na wejściu n.

x 2 3 4 5 6 7 8 9 10
f(x) 2 3 2 5 2 7 2 3 2

Wejście
W pierwszym wierszu standardowego wejścia zapisano jedną liczbę naturalną n (2 6 n 6 10 000 000).

Wyjście
W pierwszym wierszu standardowego wyjścia powinny znaleźć się jedna liczba naturalna – wartość szukanej
sumy.

Witam, znalazłby się ktoś kto pomógłby mi z tym zadaniem ?
Same zadania z najmniejszym dzielnikiem czy największym są dość proste, aczkolwiek tutaj nie do końca rozumiem od czego mam zacząć.

Ogólnie chodzi o te zadanka: https://zadania.programuj.edu.pl/c/mlodzi-mistrzowie-polskiej-infor/p/

Mam do zrobienia zadanka na lekcje, jako powtórka z 2giej klasy.

0

Nie skopiowało się poprawnie.
Podesłałem link, jest to pierwsze zadanie.

0

Masz obliczyć sumę, wiec utwórz do tego zmienną.
W innej zmiennej zapamietaj najmniejszy dzielnik = 2;
Nastepnie przejdź pętlą od i = 2 do n.
W kazdym obiegu petli sprawdź czy aktualnie zapamietany najmniejszy dzielnik dzieli liczbę i. Jak tak to dodaj do sumy.
Jak nie to znajdź nastepną liczbę która dzieli aktualnie sprawdzaną, zsumuj i i zapamietaj.

0

Mala podpowiedz: sums takich liczb, ze f(x) = 2, dla n = 100, to 100, prawda? 2, 4, 6, 8, ..., 100...

0

Napisałem coś takiego, co dalej z tym począć.

#include <iostream>

using namespace std;

int main()
{
    int suma;
    int a=2;
    
    for(int i=2;i=n;i++)
    {
        if (i%n==0)
            
    }

    return 0;
}
0

Wspomniany najmniejszy dzielnik z pewnością będzie liczbą pierwszą, można to wykorzystać (np trzymając w taliby liczby pierwsze mniejsze od 3163, bo taka wyjdzie najmniejsza liczba całkowita większa od pierwiastka z 10 000 000 czyli naszego maksimum). A już na pewno nie warto sprawdzać n większych niż i * i, jeśli liczba ma jakiekolwiek dzielniki to co najmniej jeden z nich będzie mniejszy od pierwiastka, lub też sam pierwiastek będzie jedynym dzielnikiem (w przypadku kwadratu liczby pierwszej)

0

No ok, ale jak by to wyglądało w praktyce, bo w sumie nadal nie mam żadnego pomysłu.

0

Nie powinno się robić ludziom zadań :) ale, taki kod, testowałem dla jakiś 5 liczb:

# 4programmers
# https://zadania.programuj.edu.pl/c/mlodzi-mistrzowie-polskiej-infor/p/
# Euler: https://github.com/lion137/Euler

import Euler as Eu
import math


def sum_of_the_smallest_divisors(n):
    primes = Eu.prime_sieve(int(math.sqrt(n)) + 1)
    primes = primes[1:]  # Primes od 3 do sqrt(n).
    primes_up_to_n = Eu.prime_sieve(n + 1)
    s = 2 * (n // 2)
    i = 0
    while i < len(primes):
        # Tak jak napisałem suma z f(x) = 3, 5, 7,... <= sqrt(n), dwójka policzona wcześniej,
        # bo wzór inny.
        s += primes[i] * ((n - primes[i] ** 2) // (2 * primes[i])) + 2 * primes[i]
        i += 1
    i += 1
    primes_sup = primes_up_to_n[i:]
    return s + sum(primes_sup)  # Nie zapomnieć dodać jeszcze primes większe od int(sqrt(n)).

print(sum_of_the_smallest_divisors(10000000))

Nie powinno być problemu do C++ przepisać:)

0

Wiesz co, według mnie dawanie zadań to jest paranoja. To trzeba zrozumieć, a nie zrobić ale no cóż mam zrobić jak moja nauczycielka nie wytłumaczy nam tego, a każe zrobić :D
Przepisać to raczej nie problem, ale pierw chyba trzeba znać język haha.

0
Valioox napisał(a):

Wiesz co, według mnie dawanie zadań to jest paranoja. To trzeba zrozumieć, a nie zrobić ale no cóż mam zrobić jak moja nauczycielka nie wytłumaczy nam tego, a każe zrobić :D
Przepisać to raczej nie problem, ale pierw chyba trzeba znać język haha.

No nie, dać komuś zadanie i jeszcze szydzi! A jak nie Umiesz z pseudo kodu praktycznie przepisać, to cienizna :)

0

Ja w technikum metody kompresji w zeszycie robiłem, kilka lat później sam się nauczyłem tych podstawowych, ale to co wtedy pokazywali, bez wytłumaczenia to był czad.
Jak ktoś od assemblera przec c, c++, jave i webówkę 10-15lat nie siedział to nawet nauczycielem takich języków nie powinien być.

0

No w liceum w klasie profilowanej dużo mnie nie nauczą, dlatego też wybieram się na studia by się czegoś konkretniejszego nauczyć.

Jednak żeby przepisać z kodu na kod jakiś chociażby mały programik to trzeba znać chociażby podstawy jednego jak i drugiego jezyka znać :D

0
Valioox napisał(a):

No w liceum w klasie profilowanej dużo mnie nie nauczą, dlatego też wybieram się na studia by się czegoś konkretniejszego nauczyć.

Jednak żeby przepisać z kodu na kod jakiś chociażby mały programik to trzeba znać chociażby podstawy jednego jak i drugiego jezyka znać :D

W czym problem, na początek polecam "Język C++. Szkoła programowania" - bardzo dobra książka. Poświęcisz chwilę czasu ale nie pożałujesz, jak już poznasz podstawy jednego języka to szybko poradzisz sobie z innym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1