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?:)

0

Tak, koszt przepowiedni na zamówienie: - 5000 zł ;P
Podaj zawartość pliku, lub zgłoś się do zawodowych wróżbitów, we wróżbiarstwie tu wszyscy co najwyżej amatorzy.

0

Zawartość pliku to liczby składające się tylko z zer i jedynek

1100
1110
1111
1001
1000
0100
0001
1010
0011
1101
0

Wypisujesz każdą w trzecim wierszu pętli.
Natomiast to: cout << liczby[x] << "\t"; wyświetla tylko tabulacje przez to: liczby[x][i] = liczby[x][i] - '0';

0

Ok czyli jakby to zmienić, żeby było dobrze? Może znacie jakiś sposób, którym mógłbym rozwiązać to zadanie?

0

Cofnij tą zmianę.

0

tą zamianę z tym -'0' tak? Ale da się ją cofnąć?

0

Każdą zmianę która dokonano w kodzie da się cofnąć.

0

ale nie rozumiem teraz, mam zamienić kod na coś co miałem wcześniej czy chodzi o to, że da się powrócić do stanu pierwotnego z tego

liczby[x][i] - '0' 

?

0

Da się, ale po co?

0

ehh a podpowiesz mi co mógłbym teraz zrobić aby było dobrze, aby to działało poprawnie?

0

licz sumę tak jak liczyłeś na początku.

0

Po pierwsze zacznijmy od tego, że nie do końca rozumiesz dlaczego masz błąd. Gdybyś rozumiał to dokładnie wiedziałbyś co należy robić.
Jak masz string z jakąś liczbą, powiedzmy 10110, to liczbowo to wygląda mniej więcej tak:
[49][48][49][49][48], bo znak '0' ma wartość 48 o czym wiesz.
W momencie gdy robisz

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

to Twój string będzie liczbowo tak wyglądać:
[1][0][1][1][0]
Gdy robisz potem

cout << liczby[x];

to te znaki o wartościach liczbowych 0 i 1 są wypisywane, tyle że ich nie widzisz, bo to nie są widoczne znaki.
Słowem masz nie zmieniać tego co jest w tej tablicy.

0

no masz rację, zdaje sobie sprawę, że to tak wygląda. Co nie zmienia tematu, że nie wiem jak pociągnąć te kwestie. Nie mógłby ktoś po prostu lekko poprawić mojego kodu tak, żeby to działało? Poproszę bardzo;)

0

Wejdź na początek tego tematu, zrób <Ctrl-C> tej pętli liczącej sumę, w swoim kodzie zaznacz pętle liczącą sumę i wciśnij <Ctrl-V, deb....iutancie.

1

może być nawet debil, ale ważne, żeby to zadziałało;) tu tu po prostu szczyt mojego deb...iutanckiego kunsztu, ale na początku tematu, nie widze innej pętli sumującej jak moja z wklejonego programu. Zlitujcie się nade mną i podajcie jak idiocie poprawne rozwiązanie na talerzu

0
junior95 napisał(a):
    for (int i = 0; i < liczby[x].length(); i++) {
        suma = suma + liczby[x][i] - '0';
    }
junior95 napisał(a):
    for (int i = 0; i <= liczby[x].length() - 1; i++) {
        liczby[x][i] = liczby[x][i] - '0';
        suma = suma + liczby[x][i];
    }

Naprawdę nie widzisz różnicy?

0

no to to już próbowałem i widze różnice, tyle, że wyświetla mi w kolumnie te dobre a obok kilka niewłaściwych i kilka sie powtarza...
Dobra zresetowałem DevCpp i działa bez zarzutu. Może miał cos w pamięci zapamiętane. Przepraszam za kłopoty, ogromnie dziękuję za pomoc i poświęcony czas:)

0

http://4programmers.net/Forum/1085285
Którego słowa nie rozumiesz w pierwszym zdaniu?

0

Ten temat robi się męczący. Dodaj sobie czytanie z pliku i masz gotowe:
http://ideone.com/hVt0tf

0

Zadanie uważam za rozwiązane, bo program działa jak należy i temat może zostać zamknięty;)

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