Wątek przeniesiony 2014-11-24 12:29 z C/C++ przez ŁF.

Suma cyfr liczby jest liczbą pierwszą

0

Witam,
jako zadanie domowe mam do wykonania program, który najpierw z pliku pobierze 10 liczb a następnie wypisze liczby ,
których suma cyfr jest liczbą pierwszą. Do tej pory napisałem coś takiego, ale nie działa i nie mam pomysłu co z tym dalej zrobić. Jestem w podstawie, nie chciałbym używać żadnych skompilowanych bibliotek itp.

fstream plik;
plik.open("liczby.txt", ios::in);
if (plik.good() == true) {
    cout << "Otworzylem plik" << endl;
} else {
    cout << "Blad. Problemy z plikiem" << endl;
}
string liczby[10];
for (int x = 0; x < 10; x++) {
    plik >> liczby[x];
    cout << liczby[x] << "\t";
}
cout << endl;
cout << "Lancuchy ktorych suma cyfr jest liczba pierwsza" << endl;
int suma = 0;
int sp = 0;
for (int x = 0; x < 10; x++) {
    suma = 0;
    sp = 0;
    for (int i = 0; i < liczby[x].length(); i++) {
        suma = suma + liczby[x][i] - '0';
    }
    for (int b = 1; b < suma; b++) {
        if (suma % b == 0) {
            sp = sp + 1;
        }
    }
    if (sp == 2) {
        cout << liczby[x] << "\t";
    }
}

cout << endl;
1
  1. (DOWOLNA_LICZBA%1==0) ponieważ liczysz do sumy wyłącznie to dla suma=5 sp będzie miało wartość 1
  2. Może warto zacząć sprawdzenie od 2
  3. Może warto skończyć sprawdzenie na pierwiastku z suma
  4. Może warto zrobić sito Eratostenesa, zakładając że to liczby to wystarczy sito do 83 włącznie
0
for (int b = 1; b < suma; b++)

Jak b nigdy nie będzie równe suma to sp nigdy nie będzie 2 dla liczb pierwszych.

0

Ok więc zmieniłem ten fragment na

for (int b=1;b<=suma;b++)

i w sumie nadal nie działa poprawnie....
Tak właściwie to nawet nie wiem czy to jest dobrze napisane. Bo zasada miała być taka, że sprawdza pierwszą liczbę, poprzez obliczenie jej sumy i porównanie czy jest to liczba pierwsza. I jeśli suma jest liczbą pierwszą to wypisze te liczbe i przejdzie do następnej w tablicy

0

No to wrzuć cały sformatowany, poprawiony kod w znacznikach <code> </code> ze wskazaniem czemu uważasz że nie działa poprawnie.

0
fstream plik;
plik.open("liczby.txt", ios::in);
if (plik.good() == true) {
    cout << "Otworzylem plik" << endl;
} else {
    cout << "Blad. Problemy z plikiem" << endl;
}
string liczby[10];
for (int x = 0; x < 10; x++) {
    plik >> liczby[x];
    cout << liczby[x] << "\t";
}
cout << endl;
cout << "Lancuchy ktorych suma cyfr jest liczba pierwsza" << endl;
int suma = 0;
int sp = 0;
for (int x = 0; x < 10; x++) {
    suma = 0;
    sp = 0;
    cout << liczby[x] << endl;
    for (int i = 0; i <= liczby[x].length() - 1; i++) {
        liczby[x][i] = liczby[x][i] - '0';
        suma = suma + liczby[x][i];
    }
    for (int b = 2; b <= suma; b++) {
        if (suma % b == 0) {
            sp = sp + 1;
        }
    }
    if (sp == 2) {
        cout << liczby[x] << "\t";
    }
}
cout << endl; 

Nie działa poprawnie, bo wypisuje mi wszystkie liczby. Jeśli wpisze gdzies w środku cout<<suma to wyskoczą mi kosmicznie duże liczby

0

Tak to jest jak się robi 2 poprawki na raz. Skoro liczysz od 2 int b = 2, to chyba warto zmienić warunek z sp? Jaką wartość ma sp dla liczb pierwszych?

Nie chcesz tego:

liczby[x][i] = liczby[x][i] - '0';

Edit: dobra popłynąłem z tym. W sumie to nie szkodzi, choć dziwne.
Edit2: @_13th_Dragon @junior95 jednak szkodzi, bo potem jest cout << liczby[x]

0

no dobra to powracając do koncepcji, że

int b=1 

to wtedy wypisze mi wszystkie łańcuchy plus jeszcze kilka linijek z usmieszkami

0

Szklana kula powiada że dla wszystkich liczb w pliku ta suma jest liczbą pierwsza oraz liczb tych w pliku jest mniej niż 10.

0

czy można prosić szklaną kulę o poprawienie mego błędu?:)

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