Hərflərin dəyəri#11610

Hərflərin dəyəri (Həll təhlili)

Mətni sətir-sətir emal edəcəyik. Sətirlər boşluqlar və digər istənilən simvolları ehtiva edə biləcəyindən, hər sətri tam şəkildə getline funksiyası ilə oxuyuruq. Oxuma giriş məlumatlarının sonuna qədər davam etdirilir — sətirlərin sayı əvvəlcədən məlum deyil.

Hər sətirdə simvolları növbə ilə nəzərdən keçiririk. Əgər cari simvol latın əlifbasının böyük hərfidirsə, yəni '' ≤ ≤ '', onda onun dəyəri s[i] - 'A' + 1-ə bərabərdir: '' hərfinin dəyəri , 'B'-nin – , ..., 'Z'-nin – -dır. Qalan bütün simvolları (kiçik hərflər, rəqəmlər, durğu işarələri, boşluqlar) buraxırıq.

Axtarılan hasili dəyişənində toplayacağıq. Əvvəlcə res = 1 qəbul edək. Əgər mətndə heç bir böyük latın hərfi yoxdursa, bu, cavab olacaq.

Dəyərlərin hasili tez bir zamanda çox böyük olur, buna görə də hər vurmadan sonra 10^9 + 7-yə görə qalığı götürəcəyik.

Misal

Verilmiş misalda aşağıdakı böyük latın hərfləri mövcuddur:

E (5), V (22), I (9), U (21), S (19), A (1)

Hərflərin dəyəri mötərizələrdə göstərilib. Bütün dəyərlərin hasili bərabərdir:

(5 ∗ 22 ∗ 9 ∗ 21 ∗ 19 ∗ 1) \mod 1000000007 = 395010

Alqoritmin reallaşdırılması

Hasili hesablayacağımız modulu təyin edək.

#define MOD 1000000007

Axtarılan hasili dəyişənində hesablayacağıq. Əvvəlcə ona qiyməti mənimsədirik.

res = 1;

Giriş məlumatlarının sonuna qədər mətni sətir-sətir oxuyuruq.

while (getline(cin, s))
{

Cari sətrinin simvollarını növbə ilə nəzərdən keçiririk.

  for (i = 0; i < s.size(); i++)
  {

Əgər cari simvol latın əlifbasının böyük hərfidirsə, onda onun dəyərini hesablayırıq və -i üzrə -yə vururuq.

    if (('A' <= s[i]) && (s[i] <= 'Z'))
    {
      c = s[i] - 'A' + 1;
      res = (res * c) % MOD;
    }
  }
}

Cavabı çap edirik.

cout << res << endl;