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

Как вывести числа от 1 до 1000 без сравнений в Си++?

02.03.2011, 18:08. Показов 25288. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.

Получил на собеседовании по Си++ такой странный вопрос, подумал, ещё подумал.
Ничего путного в голову не пришло. Вообщем стало дико любопытно, а как это
сделать средствами Си++?

Переадресую вопрос умным головам форума. Подскажите.

P.S. Человек с которым общался явно знал не менее двух решений.
Но я был не в том положении, чтобы спрашивать у него.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2011, 18:08
Ответы с готовыми решениями:

Вывести все числа из диапазона от 0 до 1000, которые делятся на 2 и на 3 без остатка (for, while)
Напишите программу которая выводит все числа из диапазона от 0 до 1000 которая делятца на 2 и на 3 без остатка. 2 варианта (While, for)

Найти числа, меньше 1000, сумма делителей (без самого числа) которых, больше данного числа
Найти числа, меньше 1000, сумма делителей(без самого числа) которых, больше данного числа. помогите плз

Как вывести на консоль числа от 1 до 1000 не используя цикл?
Как вывести на консоль числа от 1 до 1000 не используя цикл ?

68
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.03.2011, 01:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
если мы сейчас говорим о сях
Цитата Сообщение от ValeryS Посмотреть сообщение
переменная типа bool
......
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
16.03.2011, 01:57
Цитата Сообщение от Евгений М. Посмотреть сообщение
Вот и второе решение.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
void donothing() {}
 
void dosomething() {exit(0);}
 
int main()
{
    int i;
 
    void (*pf[2])() = {donothing, dosomething};
    
    for (i=1;; i++)
    {
        printf("%d\n", i);
        pf[i/1000]();
    }
}
вот этот код подойдёт. дизазм:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
!        void (*pf[2])() = {donothing, dosomething};
main()
main+14: movl   $0x4013c0,0x14(%esp)
main+22: movl   $0x4013c5,0x18(%esp)
!
!        for (i=1;; i++)
main+30: movl   $0x1,0x1c(%esp)
main+89: incl   0x1c(%esp)
!        {
!                printf("%d\n", i);
main+38: mov    0x1c(%esp),%eax
main+42: mov    %eax,0x4(%esp)
main+46: movl   $0x40306c,(%esp)
main+53: call   0x401cd8 <printf>
!                pf[i/1000]();
main+58: mov    0x1c(%esp),%ecx
main+62: mov    $0x10624dd3,%eax
main+67: imul   %ecx
main+69: sar    $0x6,%edx
main+72: mov    %ecx,%eax
main+74: sar    $0x1f,%eax
main+77: mov    %edx,%ecx
main+79: sub    %eax,%ecx
main+81: mov    %ecx,%eax
main+83: mov    0x14(%esp,%eax,4),%eax
main+87: call   *%eax
!        }
main+93: jmp    0x4013fd <main+38>
нету ни cmp ни test ни loop ни j** (не считая jmp)
0
16.03.2011, 01:58

Не по теме:

Ладно, что-то я завёлся, видать, пора идти баиньки, а то мозг неадекватно на недосыпание реагирует...

ValeryS, замяли...

0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 02:03
Цитата Сообщение от nxnx Посмотреть сообщение
j**
условный переход
сравнение насколько я помню cmp
и еще раз повторю это для intel для других процессоров будет по другому
и даже если так
Assembler
1
2
dec eax
jnz .....
где здесь сравнение???

Добавлено через 3 минуты
самое смешное что если было бы число меньше 1000 допустим 10
компилятор мог спокойно развернуть цикл
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
16.03.2011, 02:05
Цитата Сообщение от ValeryS Посмотреть сообщение
условный переход
сравнение насколько я помню cmp
и еще раз повторю это для intel для других процессоров будет по другому
и даже если так
Assembler
1
2
dec eax
jnz .....
где здесь сравнение???
неявное сравнение eax с нулём. аналогично:
Assembler
1
2
3
4
repeat:
 
......
loop repeat
//неявное сравнение ecx с нулём.
Но можно ли такое использовать под вопросом.
Сама операция сравнение делится на два этапа: команда меняющая флаги + j**

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
компилятор мог спокойно развернуть цикл
возможно если както заставить компилятор это сделать, скажем через ключи оптимизации,
то это тоже будет решением.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 02:17
nxnx
а ты с оптимизацией прокомпилируй

Добавлено через 5 минут
Цитата Сообщение от nxnx Посмотреть сообщение
неявное сравнение eax с нулём. аналогично
при команде dec вычитается 1 и выставляются флаги(кто сказал что там что-то сравнивается)
может там какой-нибудь триггер переключается Ты знаешь схемотехнику Пентиума? я нет
поэтому утверждать что идет сравнение не могу
Почему тогда нет неявного сравнения с другим числом

Добавлено через 3 минуты
неявное сравнение с нулем это из человеческой логики
типа если регистр (не)равен 0 то переходим
по машинному если (не)установлен флаг
а флаг может установить кто угодно вплоть до записи в регистр флагов
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
16.03.2011, 02:19
Цитата Сообщение от ValeryS Посмотреть сообщение
неявное сравнение с нулем это из человеческой логики
типа если регистр (не)равен 0 то переходим
по машинному если (не)установлен флаг
а флаг может установить кто угодно вплоть до записи в регистр флагов
Надо сделать допущение, что данная ветка решений для i386 совместимых процессоров.
Ибо большинство на них.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 02:43
Цитата Сообщение от nxnx Посмотреть сообщение
loop repeat
//неявное сравнение ecx с нулём.
еще вычитание

Добавлено через 14 минут
чей то навеяло

C++
1
2
3
4
5
for(int i=1000;;i--)
 {
 int k=1000/i;     // при 0 вылетит по исключению
 printf("%d",1001-i);
 }
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
16.03.2011, 02:48
чтобы однозначно решить такую задачу, в условии нужно писать архитектуру и какие можно использовать инструкции, и в соотв с этим создавать код.
Сравнение это всётаки j**, поскольку test\cmp не всегда есть и они аналоги and\sub по флагам.
Но можно его представить как условный переход, тоже верно, в зависимости от логики программы.
gcc отказался разворачивать цикл кстати.

Добавлено через 1 минуту
я тоже думал про вариант с исключением, можно попытатся сделать так чтобы вылетало при попытке записать туда, куда нельзя записывать.

Добавлено через 3 минуты
но всётаки вариант с исключением это уже немного не то) хотя в нём нету ни j** ни cmp\test ни loop)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
!      for( i=1000;;i--)
main()
main+14: movl   $0x3e8,0x1c(%esp)
main+61: decl   0x1c(%esp)
! {
! int k=1000/i;     // при 0 вылетит по исключению
main+22: mov    $0x3e8,%eax
main+27: cltd   
main+28: idivl  0x1c(%esp)
main+32: mov    %eax,0x18(%esp)
! printf("%d",1001-i);
main+36: mov    $0x3e9,%eax
main+41: sub    0x1c(%esp),%eax
main+45: mov    %eax,0x4(%esp)
main+49: movl   $0x40306c,(%esp)
main+56: call   0x401cb8 <printf>
! }
main+65: jmp    0x4013ed <main+22>
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 02:51
Цитата Сообщение от nxnx Посмотреть сообщение
чтобы однозначно решить такую задачу, в условии нужно писать архитектуру и какие можно использовать инструкции, и в соотв с этим создавать код.
Не согласен
Ни каждый кто хорошо знает С С++ хорошо знает ассемблер.
тем более во что превратится его код
надо задавать уровень абстракции например
не использовать < , > ==, и т.д.
или не использовать циклы
или рекурсии
или ни того не другого

Добавлено через 1 минуту
кстати исключение можно и в рекурсию запихнуть
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
16.03.2011, 02:52
Цитата Сообщение от ValeryS Посмотреть сообщение
Не согласен
Ни каждый кто хорошо знает С С++ хорошо знает ассемблер.
тем более во что превратится его код
надо задавать уровень абстракции например
не использовать < , > ==, и т.д.
или не использовать циклы
или рекурсии
или ни того не другого
либо так, либо как я написал. Ибо изначальное условие поставлено размыто.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 02:53
Цитата Сообщение от nxnx Посмотреть сообщение
gcc отказался разворачивать цикл кстати.
попробую завтра на VS
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.03.2011, 17:48
Хорошая задача. По крайней мере половина красоты задачи состоит в том, что на одной только формулировке "без сравнений" можно отсеять приличный процент нешарящих людей.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 19:47
Visual C 2008
тоже не захотел разворачивать цикл
причем
for(int i=0;i<1;i++)
честно выкинул цикл
а уже при 2 создал цикл как я его не упрашивал
Посему вопрос
Могут ли компиляторы разворачивать циклы или это фантастика??
хотя цикл
for(int i=0;i<10;i++)
m+=i;
по моему все компиляторы выбросят
0
0 / 0 / 0
Регистрация: 12.04.2008
Сообщений: 14
16.03.2011, 20:53
Цитата Сообщение от ValeryS Посмотреть сообщение
Могут ли компиляторы разворачивать циклы или это фантастика??
собери icc он развернет.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.03.2011, 21:40
Цитата Сообщение от ValeryS Посмотреть сообщение
Могут ли компиляторы разворачивать циклы или это фантастика??
Могут, если включить оптимизации. Причём разные компиляторы на разных архитектурах будут себя вести по разному. Есть опции тонкой настройки, отвечающие за такие оптимизации: ведь разворачнивание цикла (loop unroll) с одной стороны ведёт к ускорению кода, с другой - к увеличению в размерах
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 22:04
Я догадываюсь зачем разворачивают цикл
Ho nxnx на gcc, а я на VS не смог
хотя включал и быстрый код и оптимизацию по скорости
Поэтому и возник вопрос
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.03.2011, 22:10
Так просто разные настройки по дефолту. Надо опции компилятора смотреть
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
16.03.2011, 22:33
Где ж их смотреть то???
MSDN
Параметр /Ot (предпочитать скорость кода) максимизирует скорость EXE-файлов и библиотек DLL, указывая компилятору предпочесть скорость кода его краткости (это установка по умолчанию). Компилятор может сократить многие конструкции C и C++, преобразовав их в аналогичные по функциональности последовательности машинного кода. Иногда различия между ними предлагают выбор между краткостью или скоростью. Параметр /Ot подразумевается параметром "Максимальная скорость" (/O2/O1, /O2 (минимизировать размер, максимизировать скорость)). Параметр /O2 объединяет несколько возможностей по созданию очень быстрого кода.
и еще
Оптимизация цикла

При этом виде оптимизации неизменяемые части выражения удаляются из тела цикла. Оптимальный цикл включает только те выражения, значения которых изменяются при каждом выполнении цикла. В следующем примере выражение x + y в теле цикла не меняется:

Копировать код
i = -100;
while( i < 0 ) {
i += x + y;
}


После оптимизации вычисление значения для выражения x + y выполняется однократно, а не при каждом выполнении цикла:

Копировать код
i = -100;
t = x + y;
while( i < 0 ) {
i += t;
}
про развертывание ни слова

Добавлено через 1 минуту
кстати плохой пример этот цикл должен выкинутся и добавится константа

Добавлено через 4 минуты
пардон ступил
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.03.2011, 05:17
притянуто конечно..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <vector>
#include <iostream>
 
int main()
{
  std::vector<int> v( 1000 );
  try 
  { 
     for( int i=0; ;++i )
     {
       v.at( i );
       std::cout << i+1 << " "; 
     }    
   }
   catch(...)
   {
  
   }     
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.03.2011, 05:17
Помогаю со студенческими работами здесь

Написать функцию, которая получает 2 целых числа и возвращает большее из них без циклов, ветвлений и сравнений
решаем всем офисом &quot;всем привет! лектор задал задачку, я ломал голову но так и не придумал. вопрос простой. надо написать...

Вывести на экран те числа из интервала [10 .. 1000], которые меньше произведения цифр десятичной записи числа
Написать программу: среди чисел от 10 до 1000,найти и вывести на экран те, которые меньше произведения цифр десятичной записи этого числа....

Вывести простые числа в диапазоне от 2 до 1000
Здраствуйте, есть задачка: Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число называется...

Вывести простые числа на интервале от 2 до 1000
Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число называется простым, если оно делится только на 1...

Вивести на екран усі числа, що діляться на 11 без остачі від 11 до 1000 крім 110 і 220.
ДОПОМОЖІТЬ ДОРОБИТИ ЗАДАЧУ!:help: Вивести на екран усі числа, що діляться на 11 без остачі від 11 до 1000 крім 110 і 220. public...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru