Niepełny Pesel

0

Witam,
Mam problem z zadaniem, które jest tutaj: http://alfred.studmat.umk.pl:8070/ZawodyWeb/problem/633/niepe-ny-pesel.html
Zadanie jest proste, a dostaję za nie tylko 2 punkty na 6.
Liczę na jakieś wskazówki co źle (czy to błąd w kodzie, czy źle zrozumiane zadanie)
Oto kod:

#include<iostream>
using namespace std;

int main()
{
    string a;
    cin >> a;  // Łańcuch danych wejściowych
    int b[11]; // tablica liczb peselu
    int suma = 0;  // suma 10 pierwszych liczb peselu
    for(int i=0;i<=10;i++)  // obliczanie sumy i tablicy b
    {
        if (a[i]!='?'){ 
          b[i] = (int)a[i] - (int)'0';
            if (i==1 || i==5 || i==9) suma += b[i] * 3; else
              if (i==0 || i==4 || i==8) suma += b[i]; else
                if(i==2 || i==6) suma += b[i] * 7; else
                  if(i==3 || i==7) suma += b[i] * 9;
        }
    }
    b[10] = (10-(suma%10))%10;  // obliczamy ostatnią liczbę
    for(int i=0;i<=10;i++)  // wypisywanie wyniku
      cout << b[i];
    return 0;
}
 
0
  1. masz kipskie formatowanie kodu
  2. użyj debuggera

A co się stanie jak będzie a[i] == '?' Ominie znak zapytanie i policzy sobie pesel jakby nigdy nic. Musisz wstawiać w tym miejscu kolejne cyfry i sprawdzać czy pesel jest poprawny, tzn czy cyfra na ostatnim miejscu zgadza się z sumą kontrolną którą liczysz. Zakładam, że 11 cyfra jest również w ciągu wejściowym.

0

formatowanie bardzo ułatwia
main(OO0O,OO00){char OOOO[0014],OOO0[]={'1',51,0067,0x39};scanf("%s",OOOO);for
(OO00=!OO0O,OO0O=0000;OO0O<0012;OO0O++)OO00+=(OOO0[OO0O%0b100]-060)*(OOOO[OO0O
]-'0');if(0012-OO00%0012==OOOO[OO0O]-0060)puts("OK");else puts("do chrzanu");}

0

A co się stanie jak będzie a[i] == '?' Ominie znak zapytanie i policzy sobie pesel jakby nigdy nic. Musisz wstawiać w tym miejscu kolejne cyfry i sprawdzać czy pesel jest poprawny, tzn czy cyfra na ostatnim miejscu zgadza się z sumą kontrolną którą liczysz. Zakładam, że 11 cyfra jest również w ciągu wejściowym.

Tyle że myślałem, iż wystarczy przypisać b[10] tą wartość k we wzorze.
A chyba a[i] nie może być równe '?', tylko a[10], ponieważ to jest ta ostatnia cyfra kontrolna, a tylko jedna cyfra została zastąpiona znakiem '?' (chyba, że się mylę, a na pewno gdzieś się mylę).
Takie szukanie wśród kolejnych cyfr odpowiedniej wartości nic nie daje, bo się robi i tak to samo, co wcześniej.
Tutaj jest kod z takim porównaniem (chociaż mam nadzieję, że nie o to wam chodziło) i nieco zmienionym formatowaniem:

#include<iostream>

using namespace std;

int main()
{
    string a;
    cin >> a;  // łańcuch danych wejściowych
    int b[11]; // tablica liczb peselu
    int suma = 0;  // suma 10 pierwszych liczb peselu

    for(int i=0;i<=10;i++)  // obliczanie sumy i tablicy b
    {
        if (a[i]!='?')
        {
          b[i] = (int)a[i] - (int)'0';
          if (i==1 || i==5 || i==9) suma += b[i] * 3; else
          if (i==0 || i==4 || i==8) suma += b[i]; else
          if(i==2 || i==6) suma += b[i] * 7; else
          if(i==3 || i==7) suma += b[i] * 9;
        }
    }

    for(int i=0; i<=9; i++)
    {
        if(i==(10-suma%10)%10)
        {
          b[10] = i;
          break;
        }
    }

    for(int i=0;i<=10;i++)  // wypisywanie wyniku
      cout << b[i];

    return 0;
}
0

Napisz program, który dla podanego niepełnego numeru PESEL wypisze pierwszy leksykograficznie poprawny numer PESEL. Niepełność numeru PESEL polega na tym, że dokładnie jedna jego cyfra została zastąpiona przez znak '?'.

Tutaj nie jest napisane, że ? pojawi się tylko jako ostatnia cyfra.

Tutaj jest kod z takim porównaniem (chociaż mam nadzieję, że nie o to wam chodziło) i nieco zmienionym formatowaniem:

Nie, nie o to chodziło. Może inaczej. Jeżeli weźmiemy poprawny numer pesel i wstawimy gdzieś w środek znak zapytania:340?0274315, to pytanie brzmi czy można znaleźć cyfrę kryjącą się pod znakiem zapytania? Odpowiedź brzmi można. Trzeba wstawiać kolejno cyfry od 0 do 9 w miejsce znaku zapytania i sprawdzać czy suma kontrolna pierwszych dziesięciu cyfr zgadza się z 11. cyfrą kontrolną. W przypadku podanym w przykładzie, gdzie 11 cyfra jest zastąpiona znakiem zapytania, wystarczy wyliczyć sumę kontrolną, co Twój program jak mniemam wykonuje poprawnie.

Pozdrawiam

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