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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xmaster
Сообщений: n/a
#1

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

22.03.2012, 02:27. Просмотров 600. Ответов 6
Метки нет (Все метки)

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++ Дан массив F[0:n-1].Сформировать два новых массива: первый содержит элементы, не превышающие заданного числа, а второй - все остальные
C++ While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести true, если не является — вывести false.
C++ если массив не является знакочередующимся,то удалить из массива все положительные числа,в противном случае-удалить отрицательные элементы.после удален
Дано целое число N(>0). Если оно является степенью числа 3, то вывести TRUE, если не является-вывести FALSE. C++
Даны два действительных числа. Вывести первое число, если оно больше второго, и оба числа, если это не так. C++
C++ Одномерный массив. Вывести на экран все числа, индексы которых есть простые числа.
Дан целый массив. выяснить имеются ли в нем числа, состоящие только из четных цифр. Если да, то вывести все найденные числа и их порядковые номера C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5818 / 1216 / 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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
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
5818 / 1216 / 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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
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
Еще ссылки по теме:

Если x является степенью числа n, то вывести true C++
Дано натуральное число n. Определите, является ли оно степенью числа 2, и если является, то выведите значение этой степени C++
C++ Определите, является ли число степенью числа 2, и если является, то выведите значение этой степени
C++ Определить является ли заданное число трёхзначным, если нет, вывести его последнюю цифру, а если да, первую
Определить, является ли значение целочисленной переменной х четным. Если является, то вывести на печать значен C++

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

Или воспользуйтесь поиском по форуму:
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5818 / 1216 / 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
Ответ Создать тему
Опции темы

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