【藍橋】第八屆C/C++語言C組第2題 興趣小組(文件讀取、vector())

標題:興趣小組【第八屆藍橋杯C組第2題】

爲豐富同學們的業餘文化生活,某高校學生會創辦了3個興趣小組
(以下稱A組,B組,C組)。
每個小組的學生名單分別在【A.txt】,【B.txt】和【C.txt】中。
每個文件中存儲的是學生的學號。

由於工作需要,我們現在想知道:
既參加了A組,又參加了B組,但是沒有參加C組的同學一共有多少人?

請你統計該數字並通過瀏覽器提交答案。

注意:答案是一個整數,不要提交任何多餘的內容。

笨笨有話說:
哇塞!數字好多啊!一眼望過去就能發現相同的,好像沒什麼指望。
不過,可以排序啊,要是每個文件都是有序的,那就好多了。

歪歪有話說:
排什麼序啊,這麼幾行數字對計算機不是太輕鬆了嗎?
我看着需求怎麼和中學學過的集合很像啊…

準備工作

首先通過文檔的替換功能將所有逗號替換爲“ ”

瞭解文本讀取基礎知識,參考鏈接:c語言關於文件操作的常用函數(新手入門看)(當然不會文件讀取也能做,其實還更簡單,直接粘貼就好了)

關於vector這裏只需要知道:push_back() 爲在vector動態數組的最後添加一個元素

解法1:

涉及操作:文件讀取,vector()動態數組存放
思路:用文件讀入獲得三個數組,A、B交集放到AB集合,AB集合長度-ABC交集長度即爲答案

/*  讀取文件簡單操作 
	FILE *f1;//設置一個文件指針
	f1=fopen(“A.txt”,“r”);//將文件指針指向具體文件(“文件路徑”,“操作方式(這裏是’只讀‘)”)
	fscanf(f1,"%d",&temp)//從f1指向的文件裏讀數據賦值給temp(和從運行窗口輸入值類似)
	fclose(f1);//操作完畢記得關閉文件指針 
*/ 
#include <iostream>
#include <vector>
using namespace std;
const int maxn=1e5+10;
int main()
{
	int tmp,num=0; 
	vector<int> a,b,c,ab;	 
	FILE *f1,*f2,*f3;  		//打開三個文件的文件指針
	//1、讀取文件 
	f1=fopen("A.txt","r"); f2=fopen("B.txt","r"); f3=fopen("C.txt","r");
	while(fscanf(f1,"%d",&tmp)!=EOF)
		a.push_back(tmp);
	while(fscanf(f2,"%d",&tmp)!=EOF)
		b.push_back(tmp);
	while(fscanf(f3,"%d",&tmp)!=EOF)
		c.push_back(tmp);
	//2、將A,B共同擁有的元素放入ab集合;	
	for(int i=0; i<a.size(); i++) 
		for(int j=0; j<b.size(); j++) 
			if(a[i]==b[j])
				ab.push_back(a[i]);
	//3、通過num記錄ab集合和c集合共同擁有的元素 
	for(int i=0; i<ab.size(); i++)
		for(int j=0; j<c.size(); j++)
			if(ab[i]==c[j])
				num++;
	//4、ab集合元素個數-num 即爲答案 20
	//cout<<a.size()<<"  "<<b.size()<<"  "<<c.size()<<"  "<<endl;		
	cout<<ab.size()-num;
	fclose(f1);   fclose(f2);    fclose(f3);
	return 0;
}

解法2:

涉及方法:直接複製粘貼獲取數據(記得每組數據間添加間隔),靜態數組存放數據。

思路:和解法1一樣

#include <iostream>
#include <cstring>  
using namespace std;
int main()
{
	int temp,num=0,cur=0;	
	int a[4][500];	//存放數據的四個數組 
	int len[4];		//四個數組各自的長度
	memset(len,0,sizeof(len));	//長度初始化爲0 

	while(scanf("%d,",&temp)!=EOF){ //將文本中“,”替換爲“ ”後直接複製粘貼獲取數據 
		if(temp==-1) cur++; 		//在每組數據之間手動添加“-1”表示間隔 
		a[cur][len[cur]++]=temp;		
	} 

	for(int i=0; i<len[0]; i++) {
		for(int j=0; j<len[1]; j++) {
			if(a[0][i]==a[1][j]) {
				a[3][len[3]++]=a[0][i];//A,B同時擁有的元素放入a[3];
			}
		}
	}
	for(int i=0; i<len[3]; i++) {
		for(int j=0; j<len[2]; j++) {
			if(a[3][i]==a[2][j]) {
				num++;			//記錄參加了ABC三個小組的人數 
			}
		}
	}
	//cout<<len[0]<<"   "<<len[1]<<"   "<<len[2]<<"  "<<len[3]<<endl;
	cout<<len[3]-num;

	return 0;
}

解法3:

思路:將編號作爲數組下標,遍歷所有可能的編號數字,記錄A&&B&&!C的編號出現次數

#include <iostream>
using namespace std;
const int maxn=1e8+10;
bool book[3][maxn]; //宏定義默認初始化爲0,但建議還是memset()初始化一下更好一點 
int main()
{
	int i,tmp,cur=0,ans=0;
	while(scanf("%d,",&tmp)!=EOF){ //將文本中“,”替換爲“ ”後直接複製粘貼獲取數據 
		if(tmp==-1) cur++; 		   //在每組數據之間手動添加“-1”表示間隔 
		else book[cur][tmp]=1;	   //當前第cur個數組中的編號tmp存在,記爲1 		
	} 
	for(i=0;i<100000000;i++){	   //遍歷範圍內所有可能出現的編號 
		if(book[0][i]&&book[1][i]&&!book[2][i]) ans++; 
	}
	cout<<ans<<endl; 
	return 0;
}

注意: 採用“ctrl”+‘z’的方式退出數據讀取的過程

本題答案:20

附錄

A.txt
12894792, 92774113, 59529208, 22962224, 02991600, 83340521, 87365045,
40818286, 16400628, 39475245, 55933381, 76940287, 61366748, 95631228,
17102313, 50682833, 61562613, 87002524, 83062019, 51743442, 61977890,
32010762, 69680621, 87179571, 81761697, 32364296, 07833271, 36198035,
26588918, 84046668, 43059468, 73191775, 56794101, 00454780, 11141030,
10008994, 35072237, 44945158, 53959980, 75758119, 18560273, 35801494,
42102550, 22496415, 03981786, 34593672, 13074905, 07733442, 42374678,
23452507, 98586743, 30771281, 17703080, 52123562, 05898131, 56698981,
90758589, 18238802, 18217979, 04511837, 75682969, 31135682, 55379006,
42224598, 98263070, 40228312, 28924663, 11580163, 25686441, 45944028,
96731602, 53675990, 03854194, 14858183, 16866794, 40677007, 73141512,
32317341, 56641725, 43123040, 15201174, 62389950, 72887083, 76860787,
61046319, 06923746, 17874548, 46028629, 10577743, 48747364, 05328780,
59855415, 60965266, 20592606, 14471207, 70896866, 46938647, 33575820,
53426294, 56093931, 51326542, 94050481, 80114017, 33010503, 72971538,
22407422, 17305672, 78974338, 93209260, 83461794, 41247821, 26118061,
10657376, 42198057, 15338224, 50284714, 32232841, 26716521, 76048344,
23676625, 62897700, 69296551, 59653393, 38704390, 48481614, 69782897,
26850668, 37471053, 88720989, 51010849, 94951571, 60024611, 29808329,
70377786, 13899299, 09683688, 58218284, 46792829, 97221709, 45286643,
48158629, 57367208, 26903401, 76900414, 87927040, 09926730, 01508757,
15101101, 62491840, 43802529,
B.txt
44894050, 34662733, 44141729, 92774113, 99208727, 91919833, 23727681,
10003409, 55933381, 54443275, 13584702, 96523685, 50682833, 61562613,
62380975, 20311684, 93200452, 23101945, 42192880, 28992561, 18460278,
19186537, 58465301, 01111066, 62680429, 23721241, 20277631, 91708977,
57514737, 03981786, 81541612, 07346443, 93154608, 19709455, 37446968,
17703080, 72378958, 66200696, 30610382, 89586343, 33152171, 67040930,
35696683, 63242065, 99948221, 96233367, 52593493, 98263070, 01418023,
74816705, 89375940, 58405334, 96731602, 84089545, 16866794, 94737626,
01673442, 70548494, 13638168, 08163691, 11106566, 64375392, 40267902,
00897705, 56447313, 54532235, 94738425, 66642634, 83219544, 40546096,
66924991, 20592606, 96037590, 73434467, 70896866, 91025618, 57892091,
08487641, 32500082, 84412833, 23311447, 38380409, 79957822, 72971538,
69645784, 91863314, 73099909, 93209260, 83461794, 81378487, 30423273,
22233715, 32232841, 26716521, 03511221, 29196547, 58263562, 56233305,
52547525, 55812835, 87253244, 52484232, 80837360, 94098464, 52028151,
53267501, 66381929, 84381316, 59788467, 09683688, 67082008, 71605255,
80654064, 21434307, 45286643, 76556656, 82465821, 57367208, 79218980,
48460468, 59170479, 46046391, 43043164, 96544490, 83340521, 70837892,
18926791, 40818286, 28936302, 11489524, 51031183, 73860337, 13241219,
09025448, 10718828, 76360986, 26031606, 76558053, 97726139, 46473415,
48406387, 23625539, 86756012, 35164187, 49161302, 78082834, 35072237,
08602486, 29815841, 56562216, 77684187, 81751704, 20160464, 50407962,
27786415, 19893526, 00934129, 37759498, 52636463, 25666982, 43262852,
38393436, 02581136, 29323250, 56950657, 05898131, 95286262, 75574581,
54057961, 06703896, 90758589, 57782642, 34492535, 41919697, 06395464,
10993500, 81212949, 34017532, 69569396, 99009936, 57129610, 67401593,
71044018, 62076698, 29533873, 71936325, 86874388, 26545032, 35695544,
30433724, 53127345, 72887083, 25390873, 63711546, 06923746, 27783723,
33199575, 35929698, 16491251, 18276792, 62744775, 92096155, 06336570,
56141974, 73007273, 31416832, 00171057, 64176982, 46938647, 58460388,
69972026, 73724304, 27435484, 51568616, 15531822, 47788699, 11818851,
41594694, 83561325, 43107163, 56965375, 10557343, 26118061, 74650126,
90076467, 10657376, 49901436, 03425162, 61164599, 15797769, 05427896,
14444084, 36795868, 18079449, 59653393, 72942548, 06763077, 33895610,
94892653, 12085268, 65174140, 79567366, 23020126, 74290047, 13498869,
21696323, 27724594, 54941003, 38229841, 07050068,
C.txt
13404901, 39952424, 47847739, 94939581, 13809950, 70966043, 11161555,
17102313, 47079425, 50682833, 74154313, 61562613, 93200452, 37103342,
18479435, 32502597, 36198035, 54210010, 73191775, 48358178, 85544503,
05996766, 54651623, 52113220, 27465181, 23871783, 22496415, 54107041,
65899605, 56528700, 82671109, 61176034, 42374678, 51612628, 63329997,
56591652, 04552733, 12789324, 89586343, 51935014, 38611966, 43916409,
70996050, 98263070, 01418023, 65345049, 21734275, 76846198, 71506230,
00833171, 67128139, 41367555, 64769510, 44010700, 16475199, 93164325,
09386162, 95324041, 80688223, 67629139, 79552617, 76219736, 50368644,
45096021, 54972488, 63779011, 28862942, 73145521, 74078605, 66924991,
12806850, 02171001, 70896866, 73434467, 08487641, 44415025, 32500082,
84412833, 83896188, 52243759, 49191410, 38744339, 48079796, 44937032,
06267501, 81866886, 38575984, 25978688, 78974338, 41247821, 12356966,
64842303, 79127158, 02366944, 68000570, 12426275, 96409230, 00705972,
08266503, 83820884, 08831807, 43273308, 23216105, 29196547, 95160161,
05553537, 52182214, 32641346, 91553427, 24436506, 77433749, 01979664,
52028151, 88985343, 01761499, 76203088, 63237368, 23405334, 59788467,
09683688, 67755443, 29946533, 12053603, 00437479, 15200030, 45286643,
93537527, 82465821, 57367208, 53899751, 15354933, 97760830, 68933762,
80220545, 01892750, 39868288, 21524323, 69716610, 65083815, 78048499,
03227391, 83340521, 87365045, 71720254, 51031183, 89168555, 08503028,
37086236, 25103057, 87002524, 22808816, 80928090, 90741678, 15993372,
99117082, 49938176, 21755083, 86903426, 87830263, 53959980, 75758119,
59781354, 58679691, 25666982, 56307643, 47180521, 62776522, 78136608,
44882734, 90758589, 08075999, 66303819, 23480347, 11580163, 87080118,
18329165, 92514163, 89404632, 92377859, 03912329, 17499963, 59699979,
79876366, 63894807, 37857001, 86003935, 90087123, 29433345, 80298948,
61531153, 61046319, 37839841, 19421134, 48747364, 35196916, 62484573,
59907079, 36845702, 21631642, 72739317, 26283700, 80114017, 76639390,
29154110, 35159758, 47788699, 11818851, 56520669, 36396767, 36031167,
83817428, 10657376, 90076467, 14676452, 11024560, 16327605, 76048344,
14444084, 95452011, 99612346, 65172562, 84813675, 88618282, 38704390,
27998014, 63859011, 33787505, 60024611, 16229880, 13899299, 35240335,
29173227, 45036451, 66177893, 82658333, 43100730, 44520187, 74290047,
85013538, 09926730, 27724594, 95148523, 20503000, 64390907, 26006953,
98116293, 97457666, 29017396, 04634371, 70791589,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章