zadanie c++ modulo

P1
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:19
0

Witam zadanie ze strony http://main.edu.pl/pl/user.phtml?op=showtask&task=modu&con=PAS
Proszę o wskazanie co jest złe w moim rozumowaniu i zadaniu, że wyniki wychodzą błędne. Moje rozwiązanie:

Kopiuj
 #include <cstdio>
int main(){

int wynik;	
int tab[15];
int tab2[15]; //tablica zawierająca reszty z dzielenia tab przez 37
wynik = 0;

for(int i = 0; i < 15; i++)
	scanf("%d", &tab[i]);

for(int k = 0; k < 15; k++)
tab2[k] = tab[k]%37;	
	
for(int n = 0; n < 15; n++)	
{	
	for(int m = 0 && m >=n; m < 15 ; m++)	
	{	
			if(tab2[m] == tab2[n])
				wynik++;
			
			
	}	
}


printf("%d", wynik-15);	
	
	
return 0;
}
Shalom
Zakładasz posortowanie danych w tab2 a to bzdura.
unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

for(int m = 0 && m >=n; m < 15 ; m++)

co to ma być

poza tym w ogóle nie rozumiem tego rozumowania... :|
twój algorytm porównuje wszystkie reszty ze sobą (15x15=225 porównań) i jeśli są równe to zwiększa wynik, a na końcu odejmuje od niego 15
czyli jeżeli będzie tylko jedna różnica to zwiększy wynik 225 razy, potem odejmie 15 i wyrzuci "210" zamiast "1" :|
co to ma wspólnego z zadaniem to nie wiem

podpowiem że różnych wyników modulo 37 może być... 37
najprostsze rozwiązanie zawierałoby tablicę 37 elementową


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 4x, ostatnio: unikalna_nazwa
KR
przy 15 liczbach na wejsciu 37 wynikow? :)
unikalna_nazwa
"różnych wyników modulo 37"
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
0

Ja też nie rozumiem, i żeby nie komplikować ci życia podpowiem licz modulo od razu po wczytaniu liczby, a potem zastanów się jak zrobić resztę najprościej. Bo te sposoby są najlepsze (dla ułatwienia dodam że przyda się wspomniana przez poprzednika tablica, i to niekoniecznie intów, true/false też będzie dobra) .

KR
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
2

Cos takiego np.

Kopiuj
typedef unsigned short ushort;

int main()
{
    ushort result=0,number;
    bool mod[37] = {false}; // w razie jakichs true zmieniamy wszystko na false
    for(int i=0;i<15;i++)
    {
        cin >> number;
        mod[number%37] = true;
    }
    for(int i=0;i<37;i++) if(mod[i]) result++;
    cout << result << endl;
    return 0;
}
edytowany 1x, ostatnio: Krycho
Zobacz pozostałe 3 komentarze
KO
tak, wiem.. jesteś zbyt pr0 żeby odpisać.
SI
Tylko czy przy tym zapisie uwzględni np to że dany wynik może być 3 razy? moim zdaniem bez 2 pętli się nie obejdzie, albo tablicy intów (if tab[etc]=0) result++, a potem ją ++.
KO
a niby dlaczego miałaby nie uwzglednic? jak nie potrafisz sobie tego wyobrazić, to skompiluj.. tam masz tablice bool, a nie int..
KR
tak dla Ciebie jestem idz prowokuj kolegow w piaskownicy. Mam projekt testowy ktory mi sluzy do takich rzeczy i tam mam juz duzo rzeczy dorzuconych. To juz akurat bylo to mialem usuwac? Jakby sie do czegos nie doczepil to chyba by umarl...
KO
miales ignorowac, a nie udiwadniac, ze jestes z tej samej piaskownicy...
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
6

Wersja z STL: http://ideone.com/jBFwi

Kopiuj
#include <iostream>
#include <iterator>
#include <set>
#include <algorithm>

using namespace std;

int main()
{	
	istream_iterator<int> begin(cin), end;
	
	set<int> remainders;
	transform(begin, end, inserter(remainders, remainders.begin()),
		[](int number) { return number % 37; }
	);

	cout << remainders.size();

	return 0;
}

Dzięki sugestii @Endrju wyszedł jeszcze krótszy program:

Kopiuj
#include <iostream>
#include <iterator>
#include <set>
#include <algorithm>

using namespace std;

int main()
{	
	istream_iterator<int> begin(cin), end;
	
	set<int> remainders;
	transform(begin, end, inserter(remainders, remainders.begin()), bind2nd(modulus<int>(), 37));

	cout << remainders.size();

	return 0;
}
edytowany 3x, ostatnio: Rev
Zobacz pozostały 1 komentarz
Endrju
Można jeszcze std::bind i std::modulus. ;-)
OA
Jeśli już using namespace std, to wszędzie. std::cin razi. :) Fajnie rozwiązane.
RE
przeoczyłem, poprawione :>
Endrju
Btw: bind2nd jest w C++11 deprecated, zastępuje je taki boostowy bind. Będzie wtedy tak: http://ideone.com/qOtL1
Xitami
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad rok
1

zamiast hektara kodu wynikowego, coś co być może potrafiłbym zapisać w asemblerze

Kopiuj
main() {
	int i, j, m = 0;
	long long int n= -1;
	for( i=0; i < 15; i++ ) {
		scanf("%d",%j);
		if( n & (1LL << (j%37)) ) { 
			m++; 
			n ^= (1LL << (j%37)); }}
	printf("%d", m); } 
P1
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:19
0

Na moje bardzo małe doświadczenie nie rozumiem waszych programów. Czy mógłby to ktoś zrobić korzystając z tablicy, "for" ewentualnie "if", ponieważ jestem dopiero na takim poziomie.

Słuchając rad całkowicie zmieniłem koncepcję wykonania programu.
Oto mój kolejny przykład, który nie działa i proszę o pomoc.

Kopiuj
#include <cstdio>
int main(){
int wynik, x;
int tab[15];
int reszta[37];	
wynik = 0;


for(int i = 0; i < 37; i++)
reszta[i] = 0;

for(int k = 0; k < 15; k++)
scanf("%d", &tab[k]);

for(int m = 0; m < 15; m++)
{
	x = tab[m]%37;
	reszta[x]++;
}

for(int n = 0; n<37; n++)
	if(reszta[n] > 0)
	wynik++;




printf("%d", wynik);

return 0;
} 
edytowany 1x, ostatnio: pucio19
Xitami
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad rok
1

jak nie jak tak? http://ideone.com/46DjG

P1
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:19
0

Rzeczywiście się zgadza. W programie Dev-C++ po kompilacji i uruchomieniu daje zupełnie inne wyniki. Gdy skopiowałem tekst źródłowy do kompilatora online wyżej wymienionego program chodził tak jak powinien w przeciwieństwie do Dev'a. Nie rozumiem jak to jest możliwe?

unikalna_nazwa
raczej wygląda wszystko w porządku, może nie przebudowujesz projektu i odpalasz starą wersję? albo nie podajesz 15 liczb na wejście albo nie wiem co jeszcze może być nie tak...
msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:5 miesięcy
1

Rzeczywiście się zgadza. W programie Dev-C++ po kompilacji i uruchomieniu daje zupełnie inne wyniki. Gdy skopiowałem tekst źródłowy do kompilatora online wyżej wymienionego program chodził tak jak powinien w przeciwieństwie do Dev'a. Nie rozumiem jak to jest możliwe?

Dev-C++ korzysta ze starej wersji kompilatora C++, co być może powoduje że zachowuje się inaczej niż ta na ideone. Poza tym, ma trochę niezałatanych bugów i jest nierozwijany od dłuższego czasu (mówię o oficjalnej wersji wydanej 7 lat temu, nie różnych 'forkach').
Być może dobrym pomysłem byłoby ściągnięcie innego IDE?

edytowany 3x, ostatnio: msm
Xitami
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad rok
1

trochę przeformatowałem Twój programik

Kopiuj
#include <cstdio>
int main(){
	int wynik = 0;
	int reszta[37] = {0};

	for(int x, k = 0; k < 15; k++) {
		scanf("%d", &x);
		x = x % 37;
		if( reszta[x] == 0 ) {
			wynik ++;
			reszta[x] = 1; } }
	printf("%d", wynik);
	return 0; } 

A teraz popatrz na wcześniejsze posty Krycha i mój

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.