• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przypisywanie alfabetu do liczb pierwszych

VPS Starter Arubacloud
+1 głos
151 wizyt
pytanie zadane 9 marca 2021 w C i C++ przez Tomek Wilk Nowicjusz (130 p.)

Chciałbym sprawdzić czy dane wyrazy są anagramami za pomocą liczb pierwszych. I czy ktoś zna sposób żeby przypisać np. A=2?  Na razie tyle udało mi się zapisać. Z góry dziękuję za każdą pomoc!

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdlib>
using namespace std;
string wyraz1, wyraz2;
int main()
{
    cin >>wyraz1;
    cin >>wyraz2;
    int dlugosc_wyraz1=wyraz1.length();
    int dlugosc_wyraz2=wyraz2.length();
    if(dlugosc_wyraz1!=dlugosc_wyraz2)
    {
        cout<<"Te wyrazy nie sa anagramami"<<endl;
        exit(0);
    }

    transform(wyraz1.begin(),wyraz1.end(),wyraz1.begin(),::toupper);
    cout<<wyraz1<<endl;
    transform(wyraz2.begin(),wyraz2.end(),wyraz2.begin(),::toupper);
    cout<<wyraz2<<endl;
    cout<<dlugosc_wyraz1<<endl;


    return 0;
}

 

komentarz 9 marca 2021 przez TOM_CPP Pasjonat (22,640 p.)

Jeżeli w zadaniu nie jest wymagane, aby użyć liczb pierwszych, można zastanowić się nad wykorzystaniem std::map , tak jak w poniższym przykładzie ( C++17).

#include <iostream>
#include <map>

using namespace std;

auto mapText( string_view text )
{
    map<char,int> result;
    for( const auto& letter : text ) ++result[tolower(letter)];
    return result;
}

bool compare( const map<char,int>& map1 , const map<char,int>& map2 )
{
   for( auto it {cbegin(map1)} ; it!=cend(map1) ; ++it )
   {
       if( map2.find(it->first) == cend(map2) || map2.at(it->first) != it->second ) return false;
   }
   return true;
}

bool isAnagram( string_view A , string_view B )
{
    if( A.size()!=B.size() ) return false;
    return compare( mapText(A) , mapText(B) );
}

int main()
{
    cout << isAnagram( "tornister" , "roRsinteT" ) << endl;
    cout << isAnagram( "tornister" , "kornistem" ) << endl;
}

https://godbolt.org/z/T7sas1

komentarz 9 marca 2021 przez Tomek Wilk Nowicjusz (130 p.)
niestety jest wymagane użycie liczb pierwszych

1 odpowiedź

0 głosów
odpowiedź 9 marca 2021 przez tangarr Mędrzec (154,780 p.)

W alfabecie łacińskim masz 26 liter. Wystarczy, żebyś stworzył tablicę 26 liczb pierwszych.
Aby zmapować literę na liczbę pierwszą z tablicy musisz obliczyć indeks w tablicy w następujący sposób

int index = litera - 'A';

 

komentarz 9 marca 2021 przez Tomek Wilk Nowicjusz (130 p.)
Czy dało by się jakoś to obejść bez mapowania?
komentarz 9 marca 2021 przez tangarr Mędrzec (154,780 p.)

Oczywiście, że się da, ale będzie to niewydajne, ponieważ będziesz musiał wyszukiwać "skojarzoną" liczbę pierwszą osobno dla każdej litery.

Napisz sobie funkcję

int znajdz_liczbe_pierwsza(int n) {
   if (n <0) // błędny indeks
      return -1; // lub 0 lub rzuć wyjątek
   if (n == 0)
      return 2;
   // tutaj kod liczący kolejne liczby pierwsze
}

 

komentarz 9 marca 2021 przez Tomek Wilk Nowicjusz (130 p.)
Liczby pierwsze już mam wypisane z sita erastotenesa zapomniałem o tym napisać interesuje mnie tylko jakby przypisać do litery "A" wartość 2 i później te wszystkie liczby dodać i jeśli wynik będzie sobie równy to te wyrażenia są anagramami a jeśli nie to nie.
komentarz 10 marca 2021 przez TOM_CPP Pasjonat (22,640 p.)

i później te wszystkie liczby dodać

Musisz je pomnożyć. Suma nie musi być różna. Dla A=2, B=3, C=5

Słowa BBB i AAC mają taką samą sumę równą 9, a nie są anagramami.

Podobne pytania

+1 głos
1 odpowiedź 274 wizyt
+1 głos
2 odpowiedzi 11,460 wizyt
0 głosów
2 odpowiedzi 221 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez Cincin Nowicjusz (240 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...