1. 程式人生 > 其它 >C++ 試題 演算法提高 明明的隨機數

C++ 試題 演算法提高 明明的隨機數

技術標籤:藍橋杯c++

資源限制
時間限制:1.0s 記憶體限制:256.0MB


問題描述
  明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤100),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成“去重”與“排序”的工作。


輸入格式
  輸入有2行,第1行為1個正整數,表示所生成的隨機數的個數:N
  第2行有N個用空格隔開的正整數,為所產生的隨機數。
輸出格式
  輸出也是2行,第1行為1個正整數M,表示不相同的隨機數的個數。第2行為M個用空格隔開的正整數,為從小到大排好序的不相同的隨機數。


樣例輸入
10
20 40 32 67 40 20 89 300 400 15
樣例輸出
8
15 20 32 40 67 89 300 400


資料規模和約定
  (N≤100)


法一:

解題方法:

  • 利用set容器本身的性質,去重和排序
  • 使用者自行輸入,然後直接輸出即可。

源程式:

#include<iostream>
#include<set>//標頭檔案
using namespace std;
set<int>m;
void getdate(int n)//輸入
{
   int x;
   for (int i = 0; i < n; i++)
   {
   	cin >>
x; m.insert(x); } } int main() { int n; cin >> n; getdate(n); set<int>::iterator p = m.begin(); cout << m.size() << endl;//去重完後的資料個數 for (p; p != m.end(); p++)//輸出 cout << *p << " "; cout << endl; }

評測結果:

在這裡插入圖片描述

法二:

解題方法:

  • 首先是排重:利用陣列來檢驗是否已經輸入過相同的數字

還有一種方法是:使用者每輸入一個數據,就和該陣列之前的資料對比,這樣每輸入一個都要遍歷陣列,效率較低。當資料量較小時也是不錯的一種方法。

  • 其次是排序:可以使用sort()函式,直接進行排序,或者就是使用者自行編寫排序函式進行排序。

常見的排序方法有:插入排序,氣泡排序,選擇排序,謝爾排序,快速排序,堆積排序,二路歸併排序,基數排序。
本題目我使用的是謝爾排序,可根據自己喜好選擇對口的排序方法。

源程式:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a[100];
int length = 0;//去重完畢後的長度
void distinct(int n)//去重函式
{
	int dis[1000] = { 0 };
	int b[100];
	//memset(dis, 0, sizeof(dis));//初始化為零
	for (int i = 0; i < n; i++)
	{
		cin >> b[i];//中間陣列
		if (dis[b[i]] == 0)//說明之前沒有輸入過b[i]對應的資料,這種方法會比遍歷陣列比較相同的效率更高
		{
			a[length++] = b[i];
			dis[b[i]] = 1;//!!!
		}
	}
}
void sorting()//排序函式
{
	//sort(a, a + length);
	int gap = length;//謝爾排序,任選其一。
	int flag;
	while (gap > 1)
	{
		gap = gap / 2;
		do
		{
			flag = 0;
			for (int i = 0; i < length - gap; i++)
			{
				int j = i + gap;
				if (a[i] > a[j])
				{
					int temp = a[i];
					a[i] = a[j];
					a[j] = temp;
					flag = 1;
				}
			}
		} while (flag != 0);
	}
}
void print()//輸出
{
	cout << length << endl;
	for (int i = 0; i < length; i++)
		cout << a[i] << " ";
	cout << endl;
}
int main()
{
	int n;
	cin >> n;
	distinct(n);
	sorting();
	print();
}

評測結果:

在這裡插入圖片描述