Форум » Обработка символьных строк » 24 задание №162 не сходится ответ » Ответить

24 задание №162 не сходится ответ

Qwerty: Добрый день! Условие задачи: 162) Текстовый файл 24-s1.txt состоит не более чем из 106 заглавных латинских букв (A..Z). Текст разбит на строки различной длины. Необходимо найти строку, содержащую наименьшее ненулевое количество пар соседних букв, которые стоят в таком же порядке и в алфавите (например, AB, BC, CD и т.д.). Если таких строк несколько, надо взять ту, которая в файле встретилась раньше. Определите, какая буква встречается в этой строке чаще всего. Если таких букв несколько, надо взять ту, которая стоит последней в алфавите. Запишите в ответе эту букву, а затем – сколько раз она встречается во всем файле. Пример. Исходный файл: ZZQABA ZALMAC KRAKUT В этом примере в первой и второй строках по одной подходящей паре (AB и LM), в третьей таких пар нет. Берём первую строку, т.к. она находится в файле раньше. В этой строке чаще других встречаются буквы Z и A (по два раза), выбираем букву Z, т. к. она позже стоит в алфавите. В ответе для этого примера надо записать Z3, так как во всех строках файла буква Z встречается 3 раза. Ответ: W38473 Мое решение: #include <iostream> #include <string> #include <fstream> using namespace std; int main() { ifstream F("24-s1.txt "); string s, s1; int k; int k_min=10000; int a[26]={0}; //заведем массив, в котором храним количество встреченной каждой из букв while (getline( F, s )) { k=0; for (int i=0; i<s.length()-1; i++) // разница в кодах соседних букв равна 1 { if ((int) s - (int)s[i+1]==1) k++; // на сайте не видно обращение к i-му элементу } if (k<k_min && k!=0){ k_min=k; s1=s;} // запоминаем наименьшее количество пар и строку } for (int i=0; i<s1.length(); i++) // считаем, сколько раз встретилась каждая буква в подходящей строке { int x=(int)s1-(int)'A'; // тоже не видно обращение к i-му элементу строки a[x]=a[x]+1; } int Max=a[0]; int n=0; for (int i=1; i<26; i++) // ищем, какая буква встретилась чаще всего if (Max<=a) { Max=a; n=i;}; char X=(char)(n+(int)'A'); cout << X << " " ; // выводим эту букву F.clear(); F.seekg( 0 ); k=0; while (getline( F, s )) { for (int i=0; i<s.length(); i++) // считаем количество таких букв { if (X==s) k++; } } cout << k; F.close(); return 0; } Почему-то, начиная со строки if ((int) s - (int)s[i+1]==1) k++; , шрифт становится курсивным и не весь код пропечатывается :( Но программа работает и выдает ответ: Y 38566 Подскажите, пожалуйста, где я ошибаюсь

Ответов - 2

zachto: if ((int) s - (int) s[i + 1] == 1) k++; // на сайте не видно обращение к i-му элементу Должно быть [pre2]if ((int) s[ i] - (int) s[i + 1] == -1)[/pre2] или [pre2]if ((int) s[i+1] - (int) s[ i] == 1)[/pre2] Вы считываете пары вида BA, CB, .... В условии же считываются AB, BC, ...

Qwerty: Спасибо огромное!!! Все получилось ;)



полная версия страницы