• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

kod się nie kompiluje

VPS Starter Arubacloud
0 głosów
269 wizyt
pytanie zadane 23 stycznia 2023 w C i C++ przez Marcinuq Użytkownik (640 p.)

Witam! Mam problem z tym, że nie widzę błędu który nie umożliwia zwrócenia wyniku proszę o pomoc.

Mianowicie polecenie jest takie:

W pliku liczby.txt znajduje się 1000 liczb. Podaj, ile jest w pliku liczby.txt liczb, w których rozkładzie na czynniki pierwsze występują dokładnie trzy różne czynniki (mogą się one powtarzać), z których każdy jest nieparzysty.

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ifstream odczyt("liczby.txt");
    ofstream zapis("wyniki_liczby.txt");
    int liczba, licznik=0; //licznik - ilość tych liczb

    for(int i=0;i<1000;i++)
    {
        odczyt>>liczba;
        int ile_dz=0; //ilość pierwszych nieparzystych dzielników liczby
        for(int j=3;j<=liczba;j+2)
        {
            if(liczba%j==0)
            {
                ile_dz++;
            }
        }
        if(ile_dz==3)
            licznik++;
    }
    zapis<<licznik;
    odczyt.close();
    zapis.close();

    return 0;
}

 

komentarz 23 stycznia 2023 przez Great Stary wyjadacz (12,300 p.)
Ten kod powinien się kompilować. Jesteś pewien czy Twoje pytanie dotyczy tego kodu? Jakie otrzymujesz błędy kompilacji?
komentarz 23 stycznia 2023 przez Marcinuq Użytkownik (640 p.)
Nic mi się w konsoli nie wyświetla po prostu, program nie kończy działania. Tak, na pewno tego kodu dotyczy pytanie.

2 odpowiedzi

0 głosów
odpowiedź 23 stycznia 2023 przez polandonion Mądrala (6,970 p.)

Powiedz mi dlaczego miałoby się cokolwiek wyświetlać w konsoli, skoro nic nie wypisujesz strumiemien cout, tylko zapis.

zapis<<licznik;

Wejdź do pliku: wyniki_liczby.txt (tam powinno się coś znajdować)

komentarz 23 stycznia 2023 przez Marcinuq Użytkownik (640 p.)
Widać na konsoli, kiedy program wykonał swoje działanie, więc powinno pisać "press any key to continue". Ten program właśnie nie kończy działania, plik jest pusty, a z konsoli muszę wychodzić klikając w czerwony X.
komentarz 23 stycznia 2023 przez polandonion Mądrala (6,970 p.)
W takim razie możesz podesłać plik wejściowy. Możliwe, że z nim jest coś nie tak. Sprawdzę poprawność i dam ci znać.
komentarz 23 stycznia 2023 przez Marcinuq Użytkownik (640 p.)
Chodzi o ten plik liczby.txt? I gdzie go podesłać?
0 głosów
odpowiedź 23 stycznia 2023 przez Great Stary wyjadacz (12,300 p.)
for (int j = 3; j <= liczba; j + 2) // j += 2

Program nie kończy swojego działania, ponieważ pętla wykonuje się w nieskończoność. Zapis j + 2 nie zmienia wartości zmiennej j. 

komentarz 23 stycznia 2023 przez Marcinuq Użytkownik (640 p.)
tak też już próbowałem w pierwszej kolejności - nie działa :(
komentarz 23 stycznia 2023 przez Great Stary wyjadacz (12,300 p.)
Liczby w pliku muszą być duże. Twój program jest nieoptymalny i sprawdza liczbę wszystkich czynników nieparzystych (niekoniecznie pierwszych).
komentarz 23 stycznia 2023 przez Marcinuq Użytkownik (640 p.)

(W pliku liczby mają od 2 do 9 cyfr) W takim razie potrzebuję pomocy. Zmieniłem trochę tą pętlę, ale też nie działa.

for(int i=0; i<1000; i++)
    {
        odczyt>>liczba;
        int ile_dz=0; //ilość pierwszych nieparzystych dzielników liczby
        for(int j=3; j<=liczba; j+=2)
        {
            for(int k=2; k<j; k++)
            {
                if(j%k!=0)
                    continue;
                else
                    break;
            }
            ile_dz++;
        }

        if(ile_dz==3)
            licznik++;
    }

 

komentarz 23 stycznia 2023 przez Great Stary wyjadacz (12,300 p.)
Spróbuj napisać program, który będzie chociaż działać dla np. 10 stosunkowo małych liczb w pliku. Sprawdź co oznacza rozkład na czynniki pierwsze.
komentarz 24 stycznia 2023 przez Marcinuq Użytkownik (640 p.)

A co jest nie tak w tym kodzie? Według mnie wszystko powinno działać

#include <bits/stdc++.h>

using namespace std;

bool czynniki(int liczba)
{
    int ile=0;
    int czynnik=3;
    if(liczba %2 == 0) return false;
    while (liczba>1)
    {
        if (liczba % czynnik == 0) ile++;
        while (liczba%czynnik==0)
        {
            liczba = liczba/czynnik;
        }
        czynnik=czynnik+2;
        if (ile>3) return false;
    }
    if (ile == 3) return true;
    if (ile <3) return false;
}

int main()
{
    ifstream odczyt("liczby.txt");
    ofstream zapis("wyniki_liczby.txt");
    int liczba, licznik=0;
    for(int i=0; i<1000; i++)
    {
            odczyt>>liczba;
            if(czynniki(liczba))
                licznik++;
    }
    zapis<<licznik;
    odczyt.close();
    zapis.close();

    return 0;
}

 

komentarz 24 stycznia 2023 przez Great Stary wyjadacz (12,300 p.)

Kod wygląda sensownie. Czy nadal występuje problem z czasem wykonania programu? Gdybyś wysłał pokazał plik wejściowy byłoby łatwiej zreprodukować Twój problem (wstaw plik np. na pastebin). 

komentarz 24 stycznia 2023 przez Marcinuq Użytkownik (640 p.)
tak z czasem wykonania jest problem, tutaj link z tymi liczbami: https://pastebin.com/94NLmbJb
komentarz 25 stycznia 2023 przez Great Stary wyjadacz (12,300 p.)
edycja 25 stycznia 2023 przez Great

Koncepcja jest dobra, ale rozważ rozkład takiej liczby: 985408507

Jest ona pierwsza, więc pętla zanim osiągnie czynnik 985408507 wykona się 500mln razy. Możesz zmodyfikować zakres szukania czynników od 3 do pierwiastka z liczby (dokładniej jej reszty z rozkładu). Jeżeli reszta będzie większa od 1 to oznacza, że ostatni czynnik jest pierwszy.
Uprościłem kod żebyś mógł skupić się na rozwiązaniu:

#include <iostream>
#include <fstream>

int czynniki(int liczba)
{
    int ile = 0;
    for (int czynnik = 3; /* ... TODO ... */; czynnik += 2)
    {
        if (liczba % czynnik == 0)
        {
            ++ile;
        }
        while (liczba % czynnik == 0)
        {
            liczba /= czynnik;
        }
    }

    // TODO if (liczba > 1)

    return ile;
}

int main()
{
    std::ifstream odczyt("liczby.txt");
    std::ofstream zapis("wyniki_liczby.txt");
    int liczba, licznik = 0;
    while (odczyt >> liczba)
    {
        if (liczba % 2 != 0 and czynniki(liczba) == 3)
            licznik++;
    }
    zapis << licznik;
    std::cout << licznik << "\n";
    // ifstream, ofstream, fstream to RAII, pliki zostaną zamknięte automatycznie pod koniec scope
}

Podobne pytania

0 głosów
2 odpowiedzi 158 wizyt
pytanie zadane 30 grudnia 2023 w Python przez GodNorth Nowicjusz (150 p.)
0 głosów
1 odpowiedź 419 wizyt
0 głosów
1 odpowiedź 208 wizyt
pytanie zadane 16 kwietnia 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...