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

Przypisywanie alfabetu do liczb pierwszych

Object Storage Arubacloud
+1 głos
153 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ź 283 wizyt
+1 głos
2 odpowiedzi 11,514 wizyt
0 głosów
2 odpowiedzi 242 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez Cincin Nowicjusz (240 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...