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

Przypisywanie alfabetu do liczb pierwszych

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+1 głos
201 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 (155,140 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 (155,140 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ź 399 wizyt
+1 głos
2 odpowiedzi 11,942 wizyt
0 głosów
2 odpowiedzi 393 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez Cincin Nowicjusz (240 p.)

93,088 zapytań

142,046 odpowiedzi

321,473 komentarzy

62,435 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...