Помогите решить задачу. В первом ответе должно быть 29278 , а у меня 18178
В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, у которых сумма элементов кратна 60 и хотя бы один элемент из пары делится на 40, В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен. https://inf-ege.sdamgia.ru/problem?id=37368
int main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
ifstream file;
string namefile = "17.txt";
file.open(namefile);
if (!file.is_open())
{
cout << "Файл не открылся! " << endl;
file.close();
}
else
{
cout << "Файл успешно открылся!" << endl;
cout << endl;
int s;
unsigned int counter = 0;
vector<int> myArray;
while (!file.eof())
{
file >> s;
myArray.push_back(s);
}
file.close();
myArray.pop_back();
cout << "Размер вектора: "<< myArray.size() << endl;
cout << "Последний элемент: " << myArray[myArray.size()-1] << endl;
for (short unsigned int i = 0; i < myArray.size(); i++)
{
for (short unsigned int j=1 ; j < myArray.size(); j++)
{
if ((((myArray[i] + myArray[j]) % 60)) == 0)
{
if (((myArray[i] % 40) || (myArray[j] % 40)) == 0)
{
counter++;
}
}
}
}
cout << endl;
cout << "Первый ответ: " << counter << endl;
//18178
return 0;
}
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Первый цикл можно заканчивать чуть пораньше
Второй цикл нужно начинать чуть попозже, чтобы одни и те же пары не считать дважды
В условии нужно каждое выражение сравнивать на равенство с нулём
for (short unsigned int i = 0; i < myArray.size() - 1; i++)
{
for (short unsigned int j=i+1 ; j < myArray.size(); j++)
{
if ((((myArray[i] + myArray[j]) % 60)) == 0)
{
if (((myArray[i] % 40)==0) || ((myArray[j] % 40) == 0))
{
counter++;
}
}
}
}