zadanie c++ modulo

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:

 #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;
}
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ą

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) .

2

Cos takiego np.

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;
}
6

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

#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:

#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;
}
1

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

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); } 
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.

#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;
} 
1

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

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?

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?

1

trochę przeformatowałem Twój programik

#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

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