Witam, czy jest ktoś w stanie dostrzec błąd? https://ideone.com/NcQnXS21
Hej. Ja zrobiłem to tak. Na moim kopi działa dobrze wyniki są poprawne.
Na SPOJ nie działa. Dlaczego?
#include <iostream>
#include <string>
#include <cstdlib>
#include <math.h>
using namespace std;
int main()
{
string pesel;
string pomocnicza="";
double wynik=0;
int tab[11];
short ile;
cin >> ile;
for (int k = 0; k < ile; k++)
{
cin >> pesel;
for (int i = 0; i < 11; i++)
{
pomocnicza.push_back(pesel[i]);
tab[i] = atoi(pomocnicza.c_str());
pomocnicza = "";
}
tab[0] = tab[0] * 1;
tab[1] = tab[1] * 3;
tab[2] = tab[2] * 7;
tab[3] = tab[3] * 9;
tab[4] = tab[4] * 1;
tab[5] = tab[5] * 3;
tab[6] = tab[6] * 7;
tab[7] = tab[7] * 9;
tab[8] = tab[8] * 1;
tab[9] = tab[9] * 3;
tab[10] = tab[10] * 1;
for (int j = 0; j < 11; j++)
{
wynik += tab[j];
}
if ((wynik - ((floor(wynik / 10)) * 10)) == 0)
cout << "D" << endl;
else
cout << "N" << endl;
}
return 0;
}
Witam, ciągle wyrzuca mi błąd. Pdejrzewam, że ma to coś wspólnego z wczyywaniem danych za pomocą scanf (białe znaki) ponieważ gdy wpisze ciąg 11 cyfr program uważa, że to jedna wprowadzona (muszą być odzielone enterem).
Bardzo prosze o rade i z góry dziekuje
Link do kodu: https://ideone.com/b7VPaa8
scanf("%d", &pesel[i]);
wczytuje Ci całą liczbę, jeśli nie jest rozdzielona białym znakiem, a nie pojedynczą cyfrę. Możesz użyć czegoś w stylu
scanf(" %c ", &pesel[i]);
pesel[i] -= '0';
Wtedy wczyta jeden znak. Spacja przed i po %c
jest po to, żeby zjadało line feed (enter) po ostatniej cyfrze i nie wczytywało go w następnym obiegu jako znak. ‘0’
odejmujemy, gdyż komputer wczytuje jedną cyfrę jako jej kod ASCII i trzeba odjąć kod zera, żeby otrzymać tę cyfrę.
Wtedy też będziesz musiał wyzerować tablicę pesel przed pierwszym użyciem:
memset(pesel, 0, sizeof(pesel));
Lub zadeklarować ją jako tablicę charów:
char pesel[12];
Dlaczego zwiększyłem rozmiar tablicy o 1? Gdyż wtedy będzie miejsce na ostatni znak ‘\0’
, co pozwoli ci wczytywać pesel w następujący sposób:
scanf("%s", pesel);
Potem jednak w pętli będziesz musiał poodejmować kody zera.
I mała uwaga na koniec: w konsoli być może nie będzie chciało ci “ogarnąć”, że wpisałeś ostatni pesel, w takim wypadku trzeba wcisnąć CTRL-Z i potwierdzić enterem (wysyła to znak końca pliku do programu).
Powodzenia
BTW: Linijka
if(sprawdzenie(pesel)<=0) return 0;
pewnie nie spowoduje błędnej odpowiedzi w tym zadaniu, ale w takim wypadku powinieneś zgodnie ze specyfikacją zadania wypisać, że pesel jest błędny, a nie wychodzić z programu.