Program PESEL i przekraczany limit czasu

0

Witam SPOJ nie przyjmuje zadania, poniewaz przekroczono limit czasu, prosze o wasza pomoc.

 #include <stdio.h>
int main()
{
	int pesel[11];
	int wynik;
	while(1)
		{scanf( "%d", &pesel);
		wynik = pesel[0]+pesel[1]*3+pesel[2]*7+pesel[3]*9+pesel[4]*1+pesel[5]*3+pesel[6]*7+pesel[7]*9+pesel[8]+pesel[9]*3+pesel[10];
		wynik%=10;
		wynik=10-wynik;
		wynik%=10;
	if(wynik!=0)
		{printf("N\n");}
	else 
		{printf("D\n");}
	};
	return 0;
}
0

A gdzie jest opuszczenie pętli nieskończonej?

0

Nie za bardzo wiem jak to zrobić dopiero zaczynam przygodę z programowaniem, nie wiem jaki moglby byc warunek zerwania petli nieskonczonej.

0

W tym zadaniu na początku bot podaje ilość testów ;)

 
#include<iostream>
using namespace std;
int main()
{
      int t;
      cin>>t;
      for(int i=0;i<t;i++)
      {
           // i tu zadanie
      }
}

Edit: I tu masz link jak wczytywać dane http://pl.spoj.com/forum/viewtopic.php?f=10&t=1207

0

Niestety nadal nie rozumiem

0

Nie rozumiesz pętli for? Nie rozumiesz czemu pętla się nie kończy? Możesz sprecyzować? :)

0

Nie rozumiem czemu petla sie nie konczy, i jak ja zakonczyc petla for

0

Na wejściu podana jest w pojedyńczej linii ilość t<=100 numerów PESEL do sprawdzenia. W kolejnych t liniach są 11-cyfrowe liczby.

Czyli znana jest ilość tych liczb i możesz używać pętli for tak jak pokazał @Asmal, zamiast nieskończonej pętli while.

Polecam lekturę: http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Petla-for/294
W sumie to też: http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Petla-while/354

0
Asmal napisał(a):

W tym zadaniu na początku bot podaje ilość testów ;)

 
#include<iostream>
using namespace std;
int main()
{
      int t;
      cin>>t;
      for(int i=0;i<t;i++)
      {
           // i tu zadanie
      }
}

Użyj zamiast pętli while, pętle for (jest łatwiejsza do zrozumienia). W niej podajesz tak jakby 3 parametry, pierwszy "i" będzie CI zliczać które to powtórzenie pętli zaczynając od zera, "i<t" to warunek sprawdzający czy ilość powtórzeń pętli nie przekroczyło Twojej liczby testów, "i++" zwiększa "i" o jeden po każdym wykonaniu pętli.

0
#include <stdio.h>
int main()
{
	int pesel[11];
	int wynik;
	int t,i;
	scanf("%i",&t);
	for(i=0;i<t;i++)
		{
		scanf( "%d", &pesel);
		wynik = pesel[0]+pesel[1]*3+pesel[2]*7+pesel[3]*9+pesel[4]*1+pesel[5]*3+pesel[6]*7+pesel[7]*9+pesel[8]+pesel[9]*3+pesel[10];
		wynik%=10;
		wynik=10-wynik;
		wynik%=10;
	if(wynik!=0)
		{printf("N\n");}
	else 
		{printf("D\n");}
	};
	return 0;
} 

Nastepny problem tkwi w tym ze caly czas wychodzi nam wariant "N".
Gdzie tkwi błąd?

0
int pesel[11];
...
scanf( "%d", &pesel);

Deklarujesz pesel jako tablicę 11 intów, a potem wczytujesz jak do pojedynczego inta. Szybka poprawka:

scanf("%d", &pesel[i]);

Ale to nadal może być źle, bo PESEL ma 11 cyfr, a int 32-bitowy tyle nie zmieści. Musisz używać long long albo czegoś innego.

Edit: trochę się zamotałem, pesel powinien być zmienną a nie tablicą oczywiście, bo nie ma t elementów.

long long pesel;
....
scanf("%lld", &pesel);
0

Po zastosowaniu zmian i uzyciu long long int program nadal nie dziala poprawnie

0

Użyj zmiennej char to wczytywania znak po znaku (potem starczy int(ten char) i masz cyfrę), masz tu zresztą kod w cpp który mi zaliczyło:

#include <iostream>

using namespace std;

int main ()
{
    int ilezest;
    int sprpes[11];
    sprpes[0]=1;
    sprpes[1]=3;
    sprpes[2]=7;
    sprpes[3]=9;
    sprpes[4]=1;
    sprpes[5]=3;
    sprpes[6]=7;
    sprpes[7]=9;
    sprpes[8]=1;
    sprpes[9]=3;
    sprpes[10]=1;
    cin >> ilezest;
    for (int z=0;z<ilezest;z++)
    {
        char znak;
        int suma=0;
        for (int i=0;i<11;i++)
        {
            cin >>znak;
            suma = suma +((int)znak *sprpes[i]);
        }
        char reszta[10];
        cin.getline(reszta,10);
        if (suma%10==0) cout << "D" << endl;
        else cout << "N" << endl;
    }
}

reszta służy chyba do "wczytania" znaku nowej linii i tym podobnych.

0

I nie będzie bo nie rozumiesz co robisz. Weź łaskawie użyj debugera i zobacz co ci się wczytuje do twoich zmiennych. Jak czytasz to do jednego longa to potem musisz to dzielic na cyfry za pomocą reszty z dzielenia. Pewnie tego nie robisz. Sensowniej czytać to do tablicy charów pamiętając o tym że wartość danej liczby to będzie tablica[i]-'0'

0
 #include <stdio.h>
int main()
{
	char pesel[11];
	int wynik;
	int t,i;
	scanf("%i",&t);
	
for(i=0;i<t;i++)
		{scanf( "%s", &pesel[i]);
		wynik = (int)pesel[0]+(int)pesel[1]*3+(int)pesel[2]*7+(int)pesel[3]*9+(int)pesel[4]*1+(int)pesel[5]*3+(int)pesel[6]*7+(int)pesel[7]*9+(int)pesel[8]+(int)pesel[9]*3+(int)pesel[10];
		
	if(wynik%10==0)
		{printf("D\n");}
	else 
		{printf("N\n");}
	};
system("pause");
	return 0;
}

Gdzie tkwi błąd? Prosze o wyrozumialosc, jestem poczatkujacy

0

Aby pobrać 11 cyfr musisz dać nową pętle for, która będzie robiła 11 razy obrót. A poza tym jak sumujesz char nie możesz zrobić (int)pesel[0], musisz odjąć od chara 48 czyli (pesel[0]-48). I po zamknięciu fora nie powinien być średnik. I uporządkuj ten kod, bo strasznie się go czyta.

0

@chotek94 błąd jest w tym że ZNAK '0' ma WARTOŚĆ 48.
http://www.asciitable.com/index/asciifull.gif
Więc żeby ze ZNAKU '0' zrobić LICZBĘ to musisz odjąć od niego 48.

char znak = '6';
int liczba = znak - '0';
0

po co zmieniać je na inta, mi się udało na charach zrobić to zadanie

0

Jak wczytujesz do pojedyńczego chara zamiast do tablicy to nic dziwnego że glupoty wycodzą, Swoją drogą masz zatwierdzony przez spoj-a. czytelny kod

 
 #include <stdio.h>
int main()
{
    char znak[12];
    int wynik = 0;
    int i = 0;
    int ileserii = 0, seria = 0;
    scanf("%d", &ileserii);
    for (seria = 0; seria < ileserii; seria++)
    {
        wynik = 0;
        scanf("%s", znak);
        for (i = 0; i < 11; i++)
        {
            int cyfra = znak[i] - 48;
            if (i == 1 || i == 5 || i == 9 ) cyfra =  cyfra * 3;
            if (i == 2 || i == 6) cyfra = cyfra * 7;
            if (i == 3 || i == 7 ) cyfra = cyfra * 9;
            wynik = wynik +  cyfra;
        }
        if (wynik%10 == 0) puts("D");
        else puts("N");
    }

    return 0;
}

edit co do twojego kodu, to zamiast scanf( "%s", &pesel[i]); powinno być scanf( "%s",pesel); bez [i] oraz & którego przy scanf-owaniu charów do tablicy się nie daje. Być może poza tą linią jakieś inne błędy są.

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