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

C++

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

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

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

Привет всем.

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

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

P.S. Человек с которым общался явно знал не менее двух решений.
Но я был не в том положении, чтобы спрашивать у него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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)

68
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,070
16.03.2011, 01:29 #31
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, т.е. происходит неявное сравнение с нулём. Т.е. факт сравнения налицо
где сравнение???
я не явно привожу int к bool
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.03.2011, 01:31 #32
ValeryS, факт неявности не исключает факт сравнения.

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

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

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

Не по теме:

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

ValeryS, замяли...

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

Добавлено через 3 минуты
самое смешное что если было бы число меньше 1000 допустим 10
компилятор мог спокойно развернуть цикл
0
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 Посмотреть сообщение
компилятор мог спокойно развернуть цикл
возможно если както заставить компилятор это сделать, скажем через ключи оптимизации,
то это тоже будет решением.
0
16.03.2011, 02:05
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. (Число называется...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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