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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 81, средняя оценка - 4.65
sergey1369
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 6
#1

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

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

Привет всем.

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

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

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

Вывести числа, заканчивающиеся на 3 или 5, находящиеся в диапазоне от 1 до 1000 - C++ Builder
Добрый день! не могли бы мне помочь решить вот задачу запрограммированную в кнопку на форме void __fastcall...

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

Вывести все целые числа, на которые оба введенных числа делятся без остатка - C++
Пользователь вводит два целых числа. Необходимо вывести все целые числа, на которые оба введенных числа делятся без остатка. вот код...

Даны числа от 1 до 1000 и число m. Вывести результат умножение куба нечетных сотен на число m - C++
как записать?

Как из числа double 4.056 извлечь число 1000? - C++
То есть число это читается так: 4 целых 56 тысячных, вот мне нужно тысячу извлечь программно. Функции, предлагаемые math.h извлекают либо...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
16.03.2011, 01:29 #31
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, т.е. происходит неявное сравнение с нулём. Т.е. факт сравнения налицо
где сравнение???
я не явно привожу int к bool
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.03.2011, 01:31 #32
ValeryS, факт неявности не исключает факт сравнения.

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

Добавлено через 50 секунд
nxnx, ну почему же, бесконечный цикл, судя по всему, использовать разрешается.
бесконечный цикл соберётся в jmp что я и отметил
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.03.2011, 01:34 #34
nxnx, а, да, извиняюсь. Невнимательно прочитал ваше сообщение.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
16.03.2011, 01:34 #35
в архитектуре ATmega есть набор команд которые выполняются в зависимости от флага
а флаг выставляется не только операциями сравнения.
поэтому я и написал в С НЕТ сравнений
а в машинных кодах как повезет
разговор по моему о С
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.03.2011, 01:37 #36
ValeryS, во-первых, разговор, по-моему, о Си++. Во-вторых, всю жизнь думал, что while (i % 1001) эквивалентно while (i % 1001 != 0). Или я чего-то не понимаю?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
16.03.2011, 01:46 #37
Цитата Сообщение от silent_1991 Посмотреть сообщение
while (i % 1001) эквивалентно while (i % 1001 != 0).
Не эквивалентно. Хотя результат будет один и тот же(Вот такая загогулина)
в первом случае i % 1001 у тебя будут значения от 0 до 1000 (далее по циклу)
во втором i % 1001 != 0 только два значения истина и ложь
стандарт нам обещает только что ЛОЖЬ =0
ИСТИНА любое другое значение
о том что значение будет сравниваться с 0 никто не обещает
и то что это делают компиляторы для ИНТЕЛа
не факт что будут делать на других процессорах
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.03.2011, 01:48 #38
ValeryS, не понимаю, если мы сейчас говорим о сях, о какой истине или лжи идёт речь?
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
16.03.2011, 01:50 #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**
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
16.03.2011, 01:55 #40
а если так рассуждать то здесь тупо подойдет только второй пост
printN<500>();
компилятор скорее всего загонит в цикл

Добавлено через 3 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, не понимаю, если мы сейчас говорим о сях, о какой истине или лжи идёт речь?
переменная типа bool
true
false
BOOL
TRUE
FALSE
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.03.2011, 01:56 #41
Цитата Сообщение от ValeryS Посмотреть сообщение
если мы сейчас говорим о сях
Цитата Сообщение от ValeryS Посмотреть сообщение
переменная типа bool
......
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
16.03.2011, 01:57 #42
Цитата Сообщение от Евгений М. Посмотреть сообщение
Вот и второе решение.
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)
silent_1991
16.03.2011, 01:58
  #43

Не по теме:

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

ValeryS, замяли...

ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
16.03.2011, 02:03 #44
Цитата Сообщение от nxnx Посмотреть сообщение
j**
условный переход
сравнение насколько я помню cmp
и еще раз повторю это для intel для других процессоров будет по другому
и даже если так
Assembler
1
2
dec eax
jnz .....
где здесь сравнение???

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

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
компилятор мог спокойно развернуть цикл
возможно если както заставить компилятор это сделать, скажем через ключи оптимизации,
то это тоже будет решением.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2011, 02:05
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.03.2011, 02:05
Ответ Создать тему
Опции темы

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