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

Przypisywanie alfabetu do liczb pierwszych

+1 głos
110 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,620 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 VIP (140,920 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 VIP (140,920 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,620 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ź 84 wizyt
+1 głos
2 odpowiedzi 9,518 wizyt
0 głosów
2 odpowiedzi 135 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez Cincin Nowicjusz (240 p.)

89,693 zapytań

138,297 odpowiedzi

309,243 komentarzy

59,623 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...