Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 81, средняя оценка - 4.65
sergey1369
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 6
02.03.2011, 18:08     Как вывести числа от 1 до 1000 без сравнений в Си++? #1
Привет всем.

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

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

P.S. Человек с которым общался явно знал не менее двух решений.
Но я был не в том положении, чтобы спрашивать у него.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2011, 18:08     Как вывести числа от 1 до 1000 без сравнений в Си++?
Посмотрите здесь:

C++ Вывести числа в диапазоне от 0 до 500.которые делятся на 5 без остатка
подскажите: как вывести на экран числа от 0 до 20.... и еще одна: вывести все четные числа от 0 до 20... C++
Как из числа double 4.056 извлечь число 1000? C++
C++ Вывести все 6-ти значные числа, которые делятся без остатка на сумму своих цифр
Без операторов цикла вывести цифры числа через пробел C++
Вывести на экран все числа, на которые заданное число делится без остатка C++
Вывести в цикле те цифры числа, которые не делятся на 3 без остатка. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
16.03.2011, 00:53     Как вывести числа от 1 до 1000 без сравнений в Си++? #21
А это тоже считается?

C++
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
#include <vector>
#include <iostream>
#include <algorithm>
 
struct some
{
    some():i(0)
    {
    }
    int operator () ()
    {
        return ++i;
    }
    int i;
};
 
int main()
{
    const int n=1000;
    std::vector<int>(n);
    some sm;
    std::generate(vec.begin(), vec.end(), sm);
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:01     Как вывести числа от 1 до 1000 без сравнений в Си++? #22
а если так
for(int i=1000;i;i--)
printf("%d",1001-i);
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.03.2011, 01:04     Как вывести числа от 1 до 1000 без сравнений в Си++? #23
ForEveR, алгоритмы в большинстве своём — оболочки для циклов, так что не, не считается :) .
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:09     Как вывести числа от 1 до 1000 без сравнений в Си++? #24
ValeryS, думаете, в вашем коде нет сравнений?
r3almaster
 Аватар для r3almaster
0 / 0 / 0
Регистрация: 09.03.2011
Сообщений: 4
16.03.2011, 01:11     Как вывести числа от 1 до 1000 без сравнений в Си++? #25
А метки и переходы никак?)
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:23     Как вывести числа от 1 до 1000 без сравнений в Си++? #26
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, думаете, в вашем коде нет сравнений?
в С нет
когда скомпилируется может быть и будут( в машинных кодах) зависит от архитектуры
здесь используется два допущения
1 в С 0 false любое число true
2 цикл for крутится до тех пор пока условие(вторая запись) true
т.е. будет крутится пока i не станет 0
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:25     Как вывести числа от 1 до 1000 без сравнений в Си++? #27
ValeryS, т.е. происходит неявное сравнение с нулём. Т.е. факт сравнения налицо.
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:26     Как вывести числа от 1 до 1000 без сравнений в Си++? #28
можно написать и так
for(int i=1;i%1001;i++)
но такой вариант с while уже писали
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:28     Как вывести числа от 1 до 1000 без сравнений в Си++? #29
И снова неявное сравнение с нулём. Циклы тут не прокатят.
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,227
16.03.2011, 01:29     Как вывести числа от 1 до 1000 без сравнений в Си++? #30
помоему задачу надо было ставить более конкретно:
запрещены команды j** (исключая jmp; или cmp\test ?) и команды цикла, такие как loop
любое условный переход создаст в конечном коде инструкцию j**
цикл - либо создаст loop (выполнится ecx раз) либо j**
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:29     Как вывести числа от 1 до 1000 без сравнений в Си++? #31
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, т.е. происходит неявное сравнение с нулём. Т.е. факт сравнения налицо
где сравнение???
я не явно привожу int к bool
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:31     Как вывести числа от 1 до 1000 без сравнений в Си++? #32
ValeryS, факт неявности не исключает факт сравнения.

Добавлено через 50 секунд
nxnx, ну почему же, бесконечный цикл, судя по всему, использовать разрешается.
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,227
16.03.2011, 01:32     Как вывести числа от 1 до 1000 без сравнений в Си++? #33
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, факт неявности не исключает факт сравнения.

Добавлено через 50 секунд
nxnx, ну почему же, бесконечный цикл, судя по всему, использовать разрешается.
бесконечный цикл соберётся в jmp что я и отметил
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:34     Как вывести числа от 1 до 1000 без сравнений в Си++? #34
nxnx, а, да, извиняюсь. Невнимательно прочитал ваше сообщение.
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:34     Как вывести числа от 1 до 1000 без сравнений в Си++? #35
в архитектуре ATmega есть набор команд которые выполняются в зависимости от флага
а флаг выставляется не только операциями сравнения.
поэтому я и написал в С НЕТ сравнений
а в машинных кодах как повезет
разговор по моему о С
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:37     Как вывести числа от 1 до 1000 без сравнений в Си++? #36
ValeryS, во-первых, разговор, по-моему, о Си++. Во-вторых, всю жизнь думал, что while (i % 1001) эквивалентно while (i % 1001 != 0). Или я чего-то не понимаю?
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:46     Как вывести числа от 1 до 1000 без сравнений в Си++? #37
Цитата Сообщение от silent_1991 Посмотреть сообщение
while (i % 1001) эквивалентно while (i % 1001 != 0).
Не эквивалентно. Хотя результат будет один и тот же(Вот такая загогулина)
в первом случае i % 1001 у тебя будут значения от 0 до 1000 (далее по циклу)
во втором i % 1001 != 0 только два значения истина и ложь
стандарт нам обещает только что ЛОЖЬ =0
ИСТИНА любое другое значение
о том что значение будет сравниваться с 0 никто не обещает
и то что это делают компиляторы для ИНТЕЛа
не факт что будут делать на других процессорах
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.03.2011, 01:48     Как вывести числа от 1 до 1000 без сравнений в Си++? #38
ValeryS, не понимаю, если мы сейчас говорим о сях, о какой истине или лжи идёт речь?
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,227
16.03.2011, 01:50     Как вывести числа от 1 до 1000 без сравнений в Си++? #39
Assembler
1
2
3
4
5
6
7
8
9
10
!    for (i=0;i<100;i++)
main()
main+14: movl   $0x0,0x1c(%esp)
main+22: jmp    0x4013dc <main+28>
main+24: incl   0x1c(%esp)
main+28: cmpl   $0x63,0x1c(%esp)
main+33: jle    0x4013d8 <main+24>
!    {
!
!    }
Assembler
1
2
3
4
5
6
7
8
9
10
11
!    for (i=0;i<j;i++)
main()
main+22: movl   $0x0,0x1c(%esp)
main+30: jmp    0x4013e4 <main+36>
main+32: incl   0x1c(%esp)
main+36: mov    0x1c(%esp),%eax
main+40: cmp    0x18(%esp),%eax
main+44: jl     0x4013e0 <main+32>
!    {
!
!    }

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
!    while  (i%1000)
main()
main+22: jmp    0x4013dc <main+28>
main+28: mov    0x1c(%esp),%eax
main+32: mov    $0x3e8,%ecx
main+37: cltd   
main+38: idiv   %ecx
main+40: mov    %edx,%eax
main+42: test   %eax,%eax
main+44: jne    0x4013d8 <main+24>
!    {
!        i++;
main+24: incl   0x1c(%esp)
!    }
обратите внимание, везде есть инструкции j**
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2011, 01:55     Как вывести числа от 1 до 1000 без сравнений в Си++?
Еще ссылки по теме:

вывести массив без максимального и минимального числа C++
C++ Сколько сравнений понадобится в худшем случае, чтобы упорядочить по возрастанию 4 различных числа
Даны числа от 1 до 1000 и число m. Вывести результат умножение куба нечетных сотен на число m C++
C++ Вывести все целые числа, на которые оба введенных числа делятся без остатка
Вывести числа, заканчивающиеся на 3 или 5, находящиеся в диапазоне от 1 до 1000 C++ Builder

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
16.03.2011, 01:55     Как вывести числа от 1 до 1000 без сравнений в Си++? #40
а если так рассуждать то здесь тупо подойдет только второй пост
printN<500>();
компилятор скорее всего загонит в цикл

Добавлено через 3 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, не понимаю, если мы сейчас говорим о сях, о какой истине или лжи идёт речь?
переменная типа bool
true
false
BOOL
TRUE
FALSE
Yandex
Объявления
16.03.2011, 01:55     Как вывести числа от 1 до 1000 без сравнений в Си++?
Ответ Создать тему
Опции темы

Текущее время: 01:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru