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

C++

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

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

02.03.2011, 18:08. Просмотров 10670. Ответов 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
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 02:17 #46
nxnx
а ты с оптимизацией прокомпилируй

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

Добавлено через 3 минуты
неявное сравнение с нулем это из человеческой логики
типа если регистр (не)равен 0 то переходим
по машинному если (не)установлен флаг
а флаг может установить кто угодно вплоть до записи в регистр флагов
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
16.03.2011, 02:19 #47
Цитата Сообщение от ValeryS Посмотреть сообщение
неявное сравнение с нулем это из человеческой логики
типа если регистр (не)равен 0 то переходим
по машинному если (не)установлен флаг
а флаг может установить кто угодно вплоть до записи в регистр флагов
Надо сделать допущение, что данная ветка решений для i386 совместимых процессоров.
Ибо большинство на них.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 02:43 #48
Цитата Сообщение от 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
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
16.03.2011, 02:48 #49
чтобы однозначно решить такую задачу, в условии нужно писать архитектуру и какие можно использовать инструкции, и в соотв с этим создавать код.
Сравнение это всётаки 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
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 02:51 #50
Цитата Сообщение от nxnx Посмотреть сообщение
чтобы однозначно решить такую задачу, в условии нужно писать архитектуру и какие можно использовать инструкции, и в соотв с этим создавать код.
Не согласен
Ни каждый кто хорошо знает С С++ хорошо знает ассемблер.
тем более во что превратится его код
надо задавать уровень абстракции например
не использовать < , > ==, и т.д.
или не использовать циклы
или рекурсии
или ни того не другого

Добавлено через 1 минуту
кстати исключение можно и в рекурсию запихнуть
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
16.03.2011, 02:52 #51
Цитата Сообщение от ValeryS Посмотреть сообщение
Не согласен
Ни каждый кто хорошо знает С С++ хорошо знает ассемблер.
тем более во что превратится его код
надо задавать уровень абстракции например
не использовать < , > ==, и т.д.
или не использовать циклы
или рекурсии
или ни того не другого
либо так, либо как я написал. Ибо изначальное условие поставлено размыто.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 02:53 #52
Цитата Сообщение от nxnx Посмотреть сообщение
gcc отказался разворачивать цикл кстати.
попробую завтра на VS
0
Evg
Эксперт CАвтор FAQ
18259 / 6384 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
16.03.2011, 17:48 #53
Хорошая задача. По крайней мере половина красоты задачи состоит в том, что на одной только формулировке "без сравнений" можно отсеять приличный процент нешарящих людей.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 19:47 #54
Visual C 2008
тоже не захотел разворачивать цикл
причем
for(int i=0;i<1;i++)
честно выкинул цикл
а уже при 2 создал цикл как я его не упрашивал
Посему вопрос
Могут ли компиляторы разворачивать циклы или это фантастика??
хотя цикл
for(int i=0;i<10;i++)
m+=i;
по моему все компиляторы выбросят
0
Coin
0 / 0 / 0
Регистрация: 12.04.2008
Сообщений: 14
16.03.2011, 20:53 #55
Цитата Сообщение от ValeryS Посмотреть сообщение
Могут ли компиляторы разворачивать циклы или это фантастика??
собери icc он развернет.
0
Evg
Эксперт CАвтор FAQ
18259 / 6384 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
16.03.2011, 21:40 #56
Цитата Сообщение от ValeryS Посмотреть сообщение
Могут ли компиляторы разворачивать циклы или это фантастика??
Могут, если включить оптимизации. Причём разные компиляторы на разных архитектурах будут себя вести по разному. Есть опции тонкой настройки, отвечающие за такие оптимизации: ведь разворачнивание цикла (loop unroll) с одной стороны ведёт к ускорению кода, с другой - к увеличению в размерах
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 22:04 #57
Я догадываюсь зачем разворачивают цикл
Ho nxnx на gcc, а я на VS не смог
хотя включал и быстрый код и оптимизацию по скорости
Поэтому и возник вопрос
0
Evg
Эксперт CАвтор FAQ
18259 / 6384 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
16.03.2011, 22:10 #58
Так просто разные настройки по дефолту. Надо опции компилятора смотреть
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
16.03.2011, 22:33 #59
Где ж их смотреть то???
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
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.03.2011, 05:17 #60
притянуто конечно..

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
17.03.2011, 05:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 05:17
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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