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

kod się nie kompiluje

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
94 wizyt
pytanie zadane 5 dni temu w C i C++ przez Marcinuq Użytkownik (570 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 5 dni temu przez Great Stary wyjadacz (10,140 p.)
Ten kod powinien się kompilować. Jesteś pewien czy Twoje pytanie dotyczy tego kodu? Jakie otrzymujesz błędy kompilacji?
komentarz 5 dni temu przez Marcinuq Użytkownik (570 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ź 5 dni temu przez polandonion Gaduła (4,640 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 5 dni temu przez Marcinuq Użytkownik (570 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 5 dni temu przez polandonion Gaduła (4,640 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 5 dni temu przez Marcinuq Użytkownik (570 p.)
Chodzi o ten plik liczby.txt? I gdzie go podesłać?
0 głosów
odpowiedź 5 dni temu przez Great Stary wyjadacz (10,140 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 5 dni temu przez Marcinuq Użytkownik (570 p.)
tak też już próbowałem w pierwszej kolejności - nie działa :(
komentarz 5 dni temu przez Great Stary wyjadacz (10,140 p.)
Liczby w pliku muszą być duże. Twój program jest nieoptymalny i sprawdza liczbę wszystkich czynników nieparzystych (niekoniecznie pierwszych).
komentarz 5 dni temu przez Marcinuq Użytkownik (570 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 5 dni temu przez Great Stary wyjadacz (10,140 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 4 dni temu przez Marcinuq Użytkownik (570 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 4 dni temu przez Great Stary wyjadacz (10,140 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 4 dni temu przez Marcinuq Użytkownik (570 p.)
tak z czasem wykonania jest problem, tutaj link z tymi liczbami: https://pastebin.com/94NLmbJb
komentarz 4 dni temu przez Great Stary wyjadacz (10,140 p.)
edycja 4 dni temu 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
1 odpowiedź 157 wizyt
0 głosów
1 odpowiedź 151 wizyt
pytanie zadane 16 kwietnia 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,410 p.)
0 głosów
2 odpowiedzi 178 wizyt
pytanie zadane 8 grudnia 2019 w C i C++ przez Niepokonana7999 Obywatel (1,980 p.)

90,310 zapytań

138,909 odpowiedzi

311,121 komentarzy

60,024 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...