Wyjątki w spójnych podciągach cyfr liczby dziewięciocyfrowej

Odpowiedz Nowy wątek
2011-10-15 18:34
0

Witam ponownie :)
Ten kod zalicza 8/11 testów. Gdybyście mogli znaleźć wyjątki, żebym mógł poprawić kod... :)

 #include <iostream>
#include <math.h>
#include <stdlib.h> 
using namespace std;
int main() {
    int liczba, dzielnik, wynik=0;
    cin >> liczba;
    cin >> dzielnik;
    for (int i=9; i!=0; i=i-1)
    {
        for (int k=9-i; k!=0; k=k-1)
        {
            int temp = pow(10, k);
            int temp2= pow(10, i);
            if (((liczba/temp)%temp2)%dzielnik==0)
            {
                wynik=((liczba/temp)%temp2);
                break;
            }
        }
    if (wynik!=0)
        break;
    }    
    if (wynik!=0)
        cout << wynik;
    else 
        cout << "NIE";
}

Na wejściu mamy dwie liczby, liczbę dziewięciocyfrową i dzielnik. Mamy znaleźć największy spójny ciąg cyfr tej liczby, który dzieli się przez podany dzielnik. Przykładowe wejście: 987654321 18, wyjście: 765432. Jeżeli taki ciąg nie istnieje, wypisujemy NIE. Dzięki!


Pozostało 580 znaków

2011-10-15 19:23
bo
0

Przemyśl te przykłady:

722111220
22
k=2
i=6
temp=99
liczba/temp=7294052
(liczba/temp)%temp2=294052
294052
......
2257220
22
k=5
i=4
temp=100000
liczba/temp=22
(liczba/temp)%temp2=22
22

Pozostało 580 znaków

2011-10-15 20:50
0

Sprawdziłem i chyba dobrze mój program to rozgryza... 1122 to największy ciąg w tej liczbie podzielny przez 22 (?). I skąd wzięło się temp=99, skoro to są potęgi 10? Nie rozumiem tego przykładu...

Wkleiłem coś takiego:

#include <iostream>
#include <math.h>
#include <stdlib.h> 
using namespace std;
int main() {
    int liczba, dzielnik, wynik=0;
    cin >> liczba;
    cin >> dzielnik;
    for (int i=9; i!=0; i=i-1)
    {
        for (int k=9-i; k!=0; k=k-1)
        {
            int temp = pow(10, k);
            int temp2= pow(10, i);
/* ZMIANA W NASTEPNEJ LINII*/
            cout << (((liczba/temp)%temp2)) << endl;
            if (((liczba/temp)%temp2)%dzielnik==0)
            {
                wynik=((liczba/temp)%temp2);
                break;
            }
        }
    if (wynik!=0)
        break;
    }    
    if (wynik!=0)
        cout << wynik;
    else 
        cout << "NIE";
} 

i wyszło mi:

 12345678
1234567
2345678
123456
234567
345678
12345
23456
34567
45678
1234
2345
3456
4567
5678
123
234
345
456
567
678
12
23
34
45
56
67
78
1
2
3
4
5
6
7
8
NIE

on nie sprawdza ciągów z ostatnią cyfrą... ale nie wiem dlaczego :) Jak to naprawić?


edytowany 1x, ostatnio: merlinnot, 2011-10-15 20:56

Pozostało 580 znaków

2011-10-15 21:01
bo
1

To są wyniki z Twojego programu.
W pierwszym przykładzie pow(10,2) jest typu double. Prawdopodobnie wychodzi coś w rodzaju 99,99999999999999999999. Po rzutowaniu na typ całkowity masz 99. Powinieneś raczej zaokrąglać. W drugim przykładzie wyliczasz 22, a 220 jest na pewno dłuższym i spójnym podciągiem podzielnym przez 22. Masz błąd algorytmu, wiem na czym on polega., ale zostawi Ci satysfakcję samodzielnego znalezienia błędu.

Pozostało 580 znaków

2011-10-15 21:06

Sorki... w zadaniu jest napisane, że w liczbie nie ma zer... Najmocniej przepraszam za kłopot, powinienem był od razu to zaznaczyć.
Co do tych dziewiątek: jak można to zmienić? Nie wiedziałem, że to potęgowanie nie działa... Jak to jest możliwe, że nie potrafi podnieść 10^x? Czy można to poprawić? Mógłbym zdefiniować potęgowanie na początku, nie jest to w końcu takie trudne, ale kod straciłby trochę elegancji :)

EDIT: ZROBIONE!!!!
Taki głupi błąd, że lepiej nie mówić... on stawał gdy k=0, a miał jeszcze dla tego sprawdzać :)
Działający kod:

#include <iostream>
#include <math.h>
#include <stdlib.h> 
using namespace std;
int main() {
    int liczba, dzielnik, wynik=0;
    cin >> liczba;
    cin >> dzielnik;
    for (int i=9; i!=0; i=i-1)
    {
        for (int k=9-i; k!=-1; k=k-1)
        {
            int temp = pow(10, k);
            int temp2= pow(10, i);
            if (((liczba/temp)%temp2)%dzielnik==0)
            {
                wynik=((liczba/temp)%temp2);
                break;
            }
        }
    if (wynik!=0)
        break;
    }    
    if (wynik!=0)
        cout << wynik;
    else 
        cout << "NIE";
} 

Dziękuję za pomoc!


edytowany 1x, ostatnio: merlinnot, 2011-10-15 21:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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