liczby półsymetryczne cpp

Otrzymałeś(aś) rozwiązanie do zamieszczonego zadania? - podziękuj autorowi rozwiązania! Kliknij
AdaśkoG
Dopiero zaczynam
Dopiero zaczynam
Posty: 12
Rejestracja: 15 mar 2023, 10:26
Podziękowania: 10 razy
Płeć:

liczby półsymetryczne cpp

Post autor: AdaśkoG »

Dzień dobry mam problem z zadaniem

Liczby półsymetryczne to liczby, które powstały przez sklejenie dwóch liczb symetrycznych np.
443344556655 -> 443344 i 556655, 2211229889 -> 221122 i 9889, 787909 -> 787 i 909 itp.
Podaj, ile jest w pliku liczb, które po zamianie na system dziesiętny są półsymetryczne.

```cpp


bool palindrom(string liczba)
{
bool check;
for(int i=0,x=liczba.size()-1; i<liczba.size()/2; x--,i++)
{
if(liczba!=liczba[x])
{
return false;
}
}
return true;
}

bool polsymetryczna(string liczba)
{
string lewa_liczba,prawa_liczba;
for(int ostatnia_cyfra_lewej_liczby=1; ostatnia_cyfra_lewej_liczby<=liczba.size()-3; ostatnia_cyfra_lewej_liczby++)
{
lewa_liczba="";
prawa_liczba="";
for(int j=0; j<=ostatnia_cyfra_lewej_liczby; j++)
{
lewa_liczba+=liczba[j];
}
for(int j=ostatnia_cyfra_lewej_liczby+1; j<=liczba.size()-1; j++)
{
prawa_liczba+=liczba[j];
}
if(palindrom(lewa_liczba)==true && palindrom(prawa_liczba)==true)
{
return true;
}
}
return false;
}

o to jest mój kod i nie łapie on wszystkich przypadków
uziom
Dopiero zaczynam
Dopiero zaczynam
Posty: 22
Rejestracja: 05 kwie 2023, 09:01
Otrzymane podziękowania: 1 raz
Płeć:

Re: liczby półsymetryczne cpp

Post autor: uziom »

Kod: Zaznacz cały

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool is_palindrome(string str) {
    int n = str.length();
    for (int i = 0; i < n/2; i++) {
        if (str[i] != str[n-i-1]) {
            return false;
        }
    }
    return true;
}

bool is_polsymmetric(string str) {
    int n = str.length();
    for (int i = 1; i <= n-2; i++) {
        string left = str.substr(0, i);
        string right = str.substr(i);
        if (is_palindrome(left) && is_palindrome(right)) {
            return true;
        }
    }
    return false;
}

int main() {
    ifstream file("liczby.txt");
    string number;
    int count = 0;
    while (file >> number) {
        if (is_polsymmetric(number)) {
            count++;
        }
    }
    cout << "Liczba półsymetrycznych liczb w pliku: " << count << endl;
    return 0;
}
Funkcja is_palindrome sprawdza, czy podany napis jest palindromem (czyli czy czyta się go tak samo od lewej do prawej i od prawej do lewej). Funkcja is_polsymmetric sprawdza, czy podana liczba jest półsymetryczna. Wykorzystuje ona funkcję is_palindrome do sprawdzenia, czy obie części liczby są symetryczne. Następnie w pętli sprawdza wszystkie możliwe podziały liczby i zwraca true, jeśli znajdzie taki podział, dla którego obie części są symetryczne.

W funkcji main otwieramy plik "liczby.txt" i dla każdej liczby wywołujemy funkcję is_polsymmetric, zwiększając licznik, jeśli liczba jest półsymetryczna. Na końcu program wypisuje liczbę znalezionych półsymetrycznych liczb.
AdaśkoG
Dopiero zaczynam
Dopiero zaczynam
Posty: 12
Rejestracja: 15 mar 2023, 10:26
Podziękowania: 10 razy
Płeć:

Re: liczby półsymetryczne cpp

Post autor: AdaśkoG »

Super kod działa idealnie, a czy mógłby Pan powiedzieć co w swoim kodzie mam źle albo opisać troszkę bardziej działanie swojego?
uziom
Dopiero zaczynam
Dopiero zaczynam
Posty: 22
Rejestracja: 05 kwie 2023, 09:01
Otrzymane podziękowania: 1 raz
Płeć:

Re: liczby półsymetryczne cpp

Post autor: uziom »

Twój kod wydaje się poprawny, jednak może nie łapać wszystkich przypadków, ponieważ warunek półsymetryczności, który stosujesz, wymaga, aby obie połówki były palindromami. Oznacza to, że w przypadku, gdy liczba składa się z nieparzystej liczby cyfr, jedna z połówek nie będzie palindromem, a co za tym idzie, liczba nie będzie uznana za półsymetryczną.

Możesz spróbować zmodyfikować funkcję polsymetryczna w ten sposób, aby uwzględniała także liczby o nieparzystej liczbie cyfr, na przykład poprzez dodanie dodatkowego warunku, który będzie sprawdzał, czy połówki są palindromami lub czy ich środkowa cyfra jest taka sama. Oto jedna z możliwych implementacji:

Kod: Zaznacz cały

bool polsymetryczna(string liczba)
{
    int n = liczba.size();
    for (int i = 1; i <= n - 2; i++) {
        string lewa_liczba = liczba.substr(0, i);
        string prawa_liczba = liczba.substr(i, n - i);
        if ((palindrom(lewa_liczba) && palindrom(prawa_liczba)) || 
            (lewa_liczba == prawa_liczba.substr(1) && liczba[i] == prawa_liczba[0])) {
            return true;
        }
    }
    return false;
}
W tej implementacji korzystamy z funkcji substr, aby łatwiej dzielić liczbę na połowy. Dodatkowo sprawdzamy, czy środkowa cyfra (jeśli liczba ma nieparzystą liczbę cyfr) jest taka sama w obu połówkach.
Isabella
Witam na forum
Witam na forum
Posty: 1
Rejestracja: 02 wrz 2023, 08:06

Re: liczby półsymetryczne cpp

Post autor: Isabella »

A semi-symmetric number in C++ is a number that remains the same when its digits are reversed, but not necessarily for all possible digit reversals. Here's a simple C++ code snippet to check if a number is semi-symmetric:

```cpp
#include <iostream>
using namespace std;

bool isSemiSymmetric(int num) {
int original = num;
int reversed = 0;
revanced
while (num > 0) {
int digit = num % 10;
reversed = reversed * 10 + digit;
num /= 10;
}

return original == reversed;
}

int main() {
int number;
cout << "Enter a number: ";
cin >> number;

if (isSemiSymmetric(number)) {
cout << number << " is a semi-symmetric number." << endl;
} else {
cout << number << " is not a semi-symmetric number." << endl;
}

return 0;
}
```

This code takes an integer input, checks if it's semi-symmetric, and then prints the result.
ODPOWIEDZ