Другие языки программирования и технологии
Вопрос по C++
Помогите пожалуйста найти алгоритм, или код реализующий следующее:Имеется массив из n элементов(n вводится с клавиатуры), элементы массива задаются случайным образомглавный вопрос найти количество неповторяющихся элементов массива(т.е. кол-во элементов встречающихся по 1 разу)вот мой код, но он считает не количество неповторяющихся элементов,а количество сравниваний include <stdio.h># include <conio.h># include <math.h># include <time.h>#include <stdlib.h>void main(){int a[100],w,i,k,n,l,m;clrscr();randomize();scanf("%i",&n);w=0;for (i=0;i<=n-1;i++){a=random(40);printf("%5i",a); }for (i=0;i<=n-1;i++)for (k=i+1;k<=n-1;k++)if (a!=a[k]) w=w++;printf("\n%i",w);getch();}
Отсортировать массив и убрать повторы.. .
Либо завести множество и набить его элементами массива. (что по-сути - то же самое... )
#include <map>
int *mas;
int n;
..
int num_unique = std::set<int> i_set(mas,mas+n).size();
Либо завести множество и набить его элементами массива. (что по-сути - то же самое... )
#include <map>
int *mas;
int n;
..
int num_unique = std::set<int> i_set(mas,mas+n).size();
Владимир Латышев
как это реализовать, если не секрет?
си не знаю, но алгоритм подскажу
опиши какую-нибудь булиновскую переменную (будет флагом, определящим уникальность элемента массива)
по-умолчанию - состояние =true
if (a!=a[k]) w=w++;
в этой строке не суммируй w, а меняй состояние флага на false (т. е. обнаружено дублирование)
по выходу из цикла по переменной k, если состояние флага сохранилось (=true), только теперь увеличивай w
(если в си булиновского типа нет, то используй целочисленный. только тогда вместо true присваивай 0, а вместо false - 1)
опиши какую-нибудь булиновскую переменную (будет флагом, определящим уникальность элемента массива)
по-умолчанию - состояние =true
if (a!=a[k]) w=w++;
в этой строке не суммируй w, а меняй состояние флага на false (т. е. обнаружено дублирование)
по выходу из цикла по переменной k, если состояние флага сохранилось (=true), только теперь увеличивай w
(если в си булиновского типа нет, то используй целочисленный. только тогда вместо true присваивай 0, а вместо false - 1)
#include <stdio.h>
#include <stdlib.h>
#define MAX_RAND 40
#define USED -1
int main(){
int* array;
int i;
int n;
int j;
int counter = 0;
int c;
scanf( "%d", &n );
array = calloc( n, sizeof(int) );
for( i = 0; i < n; i ++ ){
array = rand( MAX_RAND );
printf( "] ", array );
}
for( i = 0; i < n; i++ ){
if( array[ i ] != USED ){
c = 1;
for( j = i+1; j < n; j++ ){
if( array[j] == array){
array[j] = USED;
c = 0;
}
counter += c;
}
}
printf( "\n%d\n", counter );
free( array );
return 0;
}
#include <stdlib.h>
#define MAX_RAND 40
#define USED -1
int main(){
int* array;
int i;
int n;
int j;
int counter = 0;
int c;
scanf( "%d", &n );
array = calloc( n, sizeof(int) );
for( i = 0; i < n; i ++ ){
array = rand( MAX_RAND );
printf( "] ", array );
}
for( i = 0; i < n; i++ ){
if( array[ i ] != USED ){
c = 1;
for( j = i+1; j < n; j++ ){
if( array[j] == array){
array[j] = USED;
c = 0;
}
counter += c;
}
}
printf( "\n%d\n", counter );
free( array );
return 0;
}
Марат Саттаров
твой же код сосет, потому что поддерживает лишь случаи с не более, чем 100 элементами в массиве
и да, такие числа ( типа 40, или 100 ) в проге надо выносить куда-нибудь, чтобы удобно было их менять
и да, такие числа ( типа 40, или 100 ) в проге надо выносить куда-нибудь, чтобы удобно было их менять
Владимир Латышев
запихал я это всё в Turbo C++ ,он выдаёт кучу ошибок, не хотит запускаться(
Похожие вопросы
- Ещё тупой вопрос по C++ :)
- Вопрос по c++ )
- Тупые вопросы по C#) Конструкторы, set, get.
- вопрос по C++ как работать с заголовками? компилятор ругается, непойму как связать 3 файла. исходники внутри.
- помогите!!! вопрос по C++ нужно написать программку "заполните массив так, чтобы все его элементы были различны.
- Очень важный вопрос по C++
- вопрос на C++
- Парочка вопросов по C++
- Несколько вопросов по C++
- вопрос к C# программистам.