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

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!

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
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ć?

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.

0

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!

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