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

Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 - C++

Восстановить пароль Регистрация
 
xmaster
Сообщений: n/a
22.03.2012, 02:27     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 #1
Array49. Дан целочисленный массив размера N. Если он является перестановкой, т. е. содержит все числа от 1 до N, то вывести 0; в противном случае вывести номер первого недопустимого элемента.

Вот решение на Паскале.

Pascal
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
Program Array49;
const
n=10;
var
arr:array[1..n]of integer;
tem:array[1..n]of integer;
i,j,temi:integer;
flag,flag1:boolean;pos:integer;
Begin
temi:=1;
for I:=1 to n do readln(arr[i]);
flag1:=true;
for i:=1 to n do 
begin
flag:=true;
for j:=1 to n do 
begin
if(arr[i]=arr[j])then flag:=false;
end;
if flag and((1<arr[i])and(arr[i]<n))then begin tem[temi]:=arr[i];inc(temi);end
else begin break; flag1:=false;pos:=i; end;
end;
if(flag1)then writeln('0')
else writeln(pos)
end.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2012, 02:27     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0
Посмотрите здесь:

C++ Компоненты текстового файла содержат целые числа. Счи-таем, что если компонента содержит два числа - это коорди-наты точки, три - координаты цент
Дан целый массив. выяснить имеются ли в нем числа, состоящие только из четных цифр. Если да, то вывести все найденные числа и их порядковые номера C++
Если x является степенью числа n, то вывести true C++
Задать массив размером N и вывести все четные числа. Ошибка выполнения C++
C++ Если дробь А/В является правильной, вывести true, иначе вывести false.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
22.03.2012, 16:32     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Решение на паскале не соответствует условию

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
 
int main()
{
    std::vector <int> vec = {2, 3, 1, 5, 5, 4};
    auto Cnt = 0;
    auto aRes = std::find_if(vec.begin(), vec.end(), [&vec, &Cnt] (int num) -> bool 
    { 
        return  num < 1 || num > vec.size() || std::find(vec.begin(), vec.begin() + ++Cnt, num) != vec.begin() + Cnt;
    });
    if(aRes != vec.end())
        std::cout<<aRes - vec.begin()<<std::endl;
    else
        std::cout<<0<<std::endl;
    system("pause");
    return 0;
}
http://ideone.com/hDBUK

Может быть предупреждение об использовании signed и unsigned значения переменных, но в этом случае его можно пропустить
go
22.03.2012, 22:27
  #3

Не по теме:

Dekio, классное решение

Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
22.03.2012, 22:36     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 #4
Цитата Сообщение от Dekio Посмотреть сообщение
C++
1
2
3
4
auto aRes = std::find_if(vec.begin(), vec.end(), [&vec, &Cnt] (int num) -> bool 
 { 
 return num < 1 || num > vec.size() || std::find(vec.begin(), vec.begin() + ++Cnt, num) != vec.begin() + Cnt;
 });
А можно прокомментировать эту конструкцию. Непонятно начинаю отсюдова
C++
1
[&vec, &Cnt]
Что это вообще такое?
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
22.03.2012, 22:40     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 #5
Gepar, я заметил 3 проблемы в задании.
1. число больше диапазона 1..n
2. число меньше диапазона 1..n
3. число в диапазоне, но дублируется, соответственно не может быть выборкой всех элементов от 1 до n.

Цитата Сообщение от Gepar Посмотреть сообщение
[&vec, &Cnt]
Что это вообще такое?
Передаем в лямбду вектор (можно размер передавать через переменную) и переменную которая будет считать текущую итерацию.



Цитата Сообщение от Gepar Посмотреть сообщение
return num < 1 || num > vec.size() || std::find(vec.begin(), vec.begin() + ++Cnt, num) != vec.begin() + Cnt
Условие, если число меньше 1, больше n, или дублируется, то мы его находим.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
22.03.2012, 22:44     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 #6
Цитата Сообщение от Dekio Посмотреть сообщение
Условие, если число меньше 1, больше n, или дублируется, то мы его находим.
Ну тут понятно, но вот по поводу лямбда функций с определением на месте же я не разобрался. Нужно сначала почитать с++11 наверное, я так и не читал его.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2012, 23:04     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0
Еще ссылки по теме:

Перегрузка операторов, если класс содержит массив C++
Проверить является ли число палиндромом, содержит ли одинаковые цифры, или все различные. C++
C++ Определить является ли заданное число трёхзначным, если нет, вывести его последнюю цифру, а если да, первую

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

Или воспользуйтесь поиском по форуму:
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
22.03.2012, 23:04     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0 #7
Gepar, коротко можно ознакомиться

http://ru.wikipedia.org/wiki/C%2B%2B11
Yandex
Объявления
22.03.2012, 23:04     Если массив является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0
Ответ Создать тему
Опции темы

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