Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22

Оптимизация цикла (перебор 5000000 элементов)

02.06.2012, 23:59. Показов 3716. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли как-то оптимизировать данный цикл?
C++
1
2
3
4
5
6
7
8
for (i=10000000; i<15000000; i++)
{
for (k = i, j = 0; j < 8; j++, k /= 10)
           mas[j] = k % 10;
 
        if (mas[0]+mas[1]+mas[2] + mas[3] == mas[4]+mas[5]+mas[6]+mas[7])
            sum_a++;
}
Где, i = Номер какого-то 8-значного числа.
j- счётчик для заполнения mas.
k - счётчик для деления.

Можно что-нибудь придумывать, что бы сравнивать суммы чисел, но применяя меньше делений?

(При переборе 5000000 элементов по времени очень долго и программа не укладывается во времени)

Заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2012, 23:59
Ответы с готовыми решениями:

Перебор без цикла
Доброго времени суток. У меня есть следующий код: for (int i = 0; i &lt; 10; i++) for (int j = 0; i &lt; 10; i++) cout &lt;&lt;...

Оптимизация цикла for
Исходные данные: имеется цикл for, прерывание которого невозможно(должен выполнить все итерации). #include &lt;iostream&gt; int...

Оптимизация цикла for
Скажите, пожалуйста, как оптимизируется первый цикл? И чем он отличается от второго? Первый цикл: int a = 2; for (int i = 0; i &lt;...

12
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
03.06.2012, 00:04
Так нехорошо писать:
C++
1
for (k = i, j = 0; j < 8; j++, k /= 10)
Что на выходе должно быть?

mas[j] = k % 10; - не совсем понятно
0
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
03.06.2012, 00:06  [ТС]
На выходе должно быть число, которое показывает, количество "счастливых" чисел
т.е.
a1+a2+a3+a4==a5+a6+a7+a8

mas[j] = k % 10; - не совсем понятно
В цикле, каждый раз число уменьшается на 1 разряд. И берётся остаток от деления на 10
Получается что в каждый m[j] пошагово заносятся числа

Например
число 12345678
будет
m[0]=1;
m[1]=2;
m[2]=3;
и т.д
0
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
03.06.2012, 00:30
Sheptashka, а если использовать не число а string? Проще будет...
0
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
03.06.2012, 00:32  [ТС]
Цитата Сообщение от KeyGen Посмотреть сообщение
Sheptashka, а если использовать не число а string? Проще будет...
А как стринг перебирать?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
03.06.2012, 07:04
Sheptashka, нужно пользоваться поиском - эта задача была здесь уже и оптимальное решение уже выкладывалось.
Для 8-мизначных билетов делаете так: заводите массив
C++
1
int a[37]={0};// все элементы массива изначально должны быть равны 0
.
Далее цикл:
C++
1
2
3
4
5
for(i=0; i<10000; i++)
{
    // здесь вычисляете сумму цифр каждого i (заносите эту сумму например в переменную t)
    a[t]++;
}
А в конце:
C++
1
2
3
4
int res=0;
for(i=0; i<37; i++)
  res+=a[i]*a[i];
//здесь в переменной res нужный результат
1
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
03.06.2012, 10:52
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
    int size = 12345678;
 
    QString temp;
    for(int i = size; i<87654321; i++)
    {
        temp.setNum(i);
        int one = temp.at(0).digitValue() + temp.at(1).digitValue() + temp.at(2).digitValue() + temp.at(3).digitValue();
        int two = temp.at(4).digitValue() + temp.at(5).digitValue() + temp.at(6).digitValue() + temp.at(7).digitValue();
 
        if(one == two)
            qDebug() << i;
    }
1
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
03.06.2012, 12:05  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Далее цикл:
Код C++
for(i=0; i<10000; i++)
{
* * // здесь вычисляете сумму цифр каждого i (заносите эту сумму например в переменную t)
* * a[t]++;
}
Немножко не понял для чего этот цикл, можно поподробнее?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
03.06.2012, 19:59
Цитата Сообщение от Sheptashka Посмотреть сообщение
Немножко не понял для чего этот цикл, можно поподробнее?
можно.
Для решения этой задачи нужно знать сколько сколько каких сумм будет получаться в левой половине. Всего сумм может быть 37 (от 0 до 36): Число с суммой 0000 - минимальная сумма, число 9999 - максимальная сумма (сумма цифр равна 36).
В данном цикле расчитывается сколько каких сумм встречается в левой половине 8-ми значного числа. Например a[0] в конце цикла будет равно 1: соответствует числу 0000.
Или например a[1] в конце цикла будет равно 4: соответсвует числам 0001, 0010, 0100, 1000.
И т.д.
0
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
03.06.2012, 22:39  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
можно.
Для решения этой задачи нужно знать сколько сколько каких сумм будет получаться в левой половине. Всего сумм может быть 37 (от 0 до 36): Число с суммой 0000 - минимальная сумма, число 9999 - максимальная сумма (сумма цифр равна 36).
В данном цикле расчитывается сколько каких сумм встречается в левой половине 8-ми значного числа. Например a[0] в конце цикла будет равно 1: соответствует числу 0000.
Или например a[1] в конце цикла будет равно 4: соответсвует числам 0001, 0010, 0100, 1000.
И т.д.
Будет ли это работать, если я задам ленту (начало и конец ленты) билетов сам?
Например с 30000000 до 35000000.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
03.06.2012, 23:07
Цитата Сообщение от Sheptashka Посмотреть сообщение
Будет ли это работать, если я задам ленту (начало и конец ленты) билетов сам?
Например с 30000000 до 35000000.
нет, не будет.
Именно для случая: с 30000000 до 35000000
нужно формировать два массива: a[37] и b[37].
C++
1
2
3
4
5
6
7
8
9
for(i=3000; i<=3500; i++)
//формируем массив a[]
for(i=0; i<=9999; i++)
//формируем массив b[]
 
int res=0;
for(i=0; i<37; i++)
    res+=a[i]*b[i];
//здесь в переменной res нужное значение
1
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
04.06.2012, 12:25  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
нет, не будет.
Именно для случая: с 30000000 до 35000000
нужно формировать два массива: a[37] и b[37].
C++
1
2
3
4
5
6
7
8
9
for(i=3000; i<=3500; i++)
//формируем массив a[]
for(i=0; i<=9999; i++)
//формируем массив b[]
 
int res=0;
for(i=0; i<37; i++)
    res+=a[i]*b[i];
//здесь в переменной res нужное значение
А если ещё усложнить задачу и задать ленту
12345678 до 23456789

Не могли бы пояснить , как надо составить цикл в этом случае?
Заранее спасибо
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
04.06.2012, 15:39
Цитата Сообщение от Sheptashka Посмотреть сообщение
А если ещё усложнить задачу и задать ленту
12345678 до 23456789
Не могли бы пояснить , как надо составить цикл в этом случае?
Заранее спасибо
Давайте условимся так (на примере 12345678 до 23456789):
первое число обязательно меньше или равно второму.
A1 назовем левую половину первого числа (для нашего примера это 1234).
A2 назовем правую половину первого числа (для нашего примера это 5678).
B1 назовем левую половину второго числа (для нашего примера это 2345).
B2 назовем правую половину второго числа (для нашего примера это 6789).
Формируем два массива a[37] и b[37] по такому правилу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(i=A1; i<=B1; i++)
// формируем массив a[] (формирование массивов см в посте №6)
if(A1==B1) 
for(i=A2; i<=B2; i++)
// формируем массив b[]
if(A1==B1-1)
{
for(i=A2; i<=9999; i++)
// формируем массив b[]
for(i=0; i<=B2; i++)
// формируем массив b[]
if(A1<B1-1) 
for(i=0; i<=9999; i++)
// формируем массив b[]
}
в конце:
C++
1
2
3
4
int res=0;
for(i=0; i<37; i++)
    res+=a[i]*b[i];
//здесь в переменной res нужное значение
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.06.2012, 15:39
Помогаю со студенческими работами здесь

Оптимизация цикла по скорости
Помогите пожалуйста оптимизировать данный цикл (изменить его, чтобы он выполнялся быстрее): int a = new int; int b = new int; ...

Оптимизация условия цикла while
Доброго времени суток, друзья! Я еще совсем новичок в С++. Подскажите плз как оптимизировать следующее условие выхода из цикла while. Уж...

Полный перебор и сокращенный перебор, путем исключения одного цикла
1) Разработать на основе метода полного перебора программу razmen1 для решения задачи о способах размена купюры достоинством 100 условных...

Перебор всех возможных вариантов, оптимизация макроса
Всем доброго времени суток! Для калибровки скоринговой карты необходимо сделать подстановку всех возможных вариантов ответов (6 для...

Перебор цикла в случайном порядке
for(i=1;i&lt;=10;i++) { alert(i); //do smthn } В данном примере i будут перебираться в порядке 1;2;3;4;5;6;7;8;9;10 Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru