Pytanie odn. zadania z matury 2017

0

Treść zadania:

Plik punkty.txt zawiera 1000 wierszy, w których zapisane są po dwie liczby całkowite z przedziału [0, 10000], oddzielone pojedynczym odstępem. Para liczb w każdym wierszu odpowiada współrzędnym (x, y) jednego punktu w układzie kartezjańskim. W danych punkty się nie powtarzają. Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku odp.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.

Punkt, w którym mam problem:

  1. Dwie liczby są cyfropodobne, jeżeli do zapisania każdej z nich wykorzystujemy takie same cyfry
    dziesiętne. Podaj ile jest punktów, których współrzędne są cyfropodobne.
    Przykład:
    Liczby będące współrzędnymi punktu (123, 1321) są cyfropodobne, ponieważ obie zostały zapisane
    za pomocą cyfr 1, 2, 3.
    Przykład:
    Liczby będące współrzędnymi punktu (505, 55) nie są cyfropodobne, ponieważ do zapisania
    pierwszej liczby wykorzystano cyfry 0 i 5, a do zapisania drugiej z nich wykorzystano tylko cyfrę 5.

Mianowicie otrzymuję w wyniku 22 liczby, a powinienem otrzymać 5.
Czy mógłby mi ktoś pomóc i wyjaśnić, gdzie mam błąd?

punkty.txt

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;

ifstream in;
ofstream out;

struct punkt{
string x,y;
}q;
vector<punkt>w;

void wczytanie_punktow_do_stringa(){
punkt q;
in.open("punkty.txt");
while(in>>q.x>>q.y)
    w.push_back(q);
in.close();
}
void odp2(){
 int cyfropodobne = 0;
 bool TN = false;
 for(int i = 0; i < w.size(); i++){
    for(int j = 0; j < 5; j++){
    if(w[i].x[j] == w[i].y[0] || w[i].x[j] == w[i].y[1] || w[i].x[j] == w[i].y[2] || w[i].x[j] == w[i].y[3] || w[i].x[j] == w[i].y[4]){
        TN = true;
        continue;
    }
     else {
        TN = false;
        break;
     }
    }
     if(TN == true)
        cyfropodobne++;
    }
 cout<<"2. "<<endl;
 cout<<cyfropodobne<<endl;
 }
int main()
{
    wczytanie_punktow_do_stringa();
    odp2();
    return 0;
}
1
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

int digits(int v)
{
	int ret=0;
	for(int n=1;n;v=n) ret|=(1<<(v-10*(n=v/10)));
	return ret;
}

bool answer2(int x,int y) { return digits(x)==digits(y); }
 
int main()
{
	ifstream ifs("punkty.txt");
	ofstream ofs("odp.txt");
	int count2=0;
    for(int x,y;ifs>>x>>y;) if(answer2(x,y)) ++count2;
    ofs<<"2. "<<count2<<endl;
    return 0;
}
1
Boxwood napisał(a):

Treść zadania:

Plik punkty.txt zawiera 1000 wierszy, w których zapisane są po dwie liczby całkowite z przedziału [0, 10000], oddzielone pojedynczym odstępem. Para liczb w każdym wierszu odpowiada współrzędnym (x, y) jednego punktu w układzie kartezjańskim. W danych punkty się nie powtarzają. Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku odp.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.

Punkt, w którym mam problem:

  1. Dwie liczby są cyfropodobne, jeżeli do zapisania każdej z nich wykorzystujemy takie same cyfry
    dziesiętne. Podaj ile jest punktów, których współrzędne są cyfropodobne.
    Przykład:
    Liczby będące współrzędnymi punktu (123, 1321) są cyfropodobne, ponieważ obie zostały zapisane
    za pomocą cyfr 1, 2, 3.
    Przykład:
    Liczby będące współrzędnymi punktu (505, 55) nie są cyfropodobne, ponieważ do zapisania
    pierwszej liczby wykorzystano cyfry 0 i 5, a do zapisania drugiej z nich wykorzystano tylko cyfrę 5.

Mianowicie otrzymuję w wyniku 22 liczby, a powinienem otrzymać 5.
Czy mógłby mi ktoś pomóc i wyjaśnić, gdzie mam błąd?

punkty.txt

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;

ifstream in;
ofstream out;

struct punkt{
string x,y;
}q;
vector<punkt>w;

void wczytanie_punktow_do_stringa(){
punkt q;
in.open("punkty.txt");
while(in>>q.x>>q.y)
    w.push_back(q);
in.close();
}
void odp2(){
 int cyfropodobne = 0;
 bool TN = false;
 for(int i = 0; i < w.size(); i++){
    for(int j = 0; j < 5; j++){
    if(w[i].x[j] == w[i].y[0] || w[i].x[j] == w[i].y[1] || w[i].x[j] == w[i].y[2] || w[i].x[j] == w[i].y[3] || w[i].x[j] == w[i].y[4]){
        TN = true;
        continue;
    }
     else {
        TN = false;
        break;
     }
    }
     if(TN == true)
        cyfropodobne++;
    }
 cout<<"2. "<<endl;
 cout<<cyfropodobne<<endl;
 }
int main()
{
    wczytanie_punktow_do_stringa();
    odp2();
    return 0;
}

Ty może wyjaśnij swój proces myślowy jaki miałeś przy tej metodzie liczenia, bo ja nie widzę jak to w ogóle ma liczyć to co jest w zadaniu opisane.

0

Linie 27-29 to jakiś chaos, który kończy się buffer overflow.
Ten for w linii 28 to jest WTD i jeszcze zawartość if-a też nie ma logicznego wytłumaczenia.
Skąd ta wartość 5?

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