2014第六屆華為程式設計大賽初賽第四輪

YunShell發表於2014-05-05
/***********************************************************************
第一題 求n個整數的最大公約數
輸入
	第一行: n個整數
	第二行:各個整數 以空格隔開
輸出;公約數
例子: 
input: 4
	  10 15 20 25
output: 5
**********************************************************************/
#include <stdio.h>
//轉轉相除法
int gcd(int x, int y) 
{  //非遞迴形式 
	int rst=-1;
	while(y)
	{
		rst=y;
		y=x%y;
		x=rst;
	}
	return rst;
	//遞迴形式
//	return (y == 0) ? x : gcd(y, x % y);  
}  
//求最小公倍數 lowest common multiple ( LCM )
//先得到兩個數的最大公約數,然後用兩個數的乘積除以該公約數
//比如 lcm(10,15) =10*15/gcd(10,15)=150/5=30;
int lcm(int x,int y)
{
	int rst=gcd(x,y);
	return (x*y)/rst;
}
//獲取n個整數的最大公約數
int Getgcd(int a[],int len)
{
	int rst=gcd(a[0],a[1]);
	for(int j=2;j<len;j++)
		rst=gcd(a[j],rst);
	return rst;
}
//獲取n個整數的最小公倍數
int GetLcm(int a[],int len)
{
	int rst=lcm(a[0],a[1]);
	for(int j=2;j<len;j++)
		rst=lcm(a[j],rst);
	return rst;
}
int main()
{	
	int num;
	scanf("%d",&num);

	int *a=new int[num];
	if(NULL==a)
		return -1;
	int i=0;
	char ch;
	while(scanf("%d%c",&a[i++],&ch)!=EOF)
	{
		if(ch=='\n')
			break;
	}
	int rst; 
	if(num==1)
		rst=a[0];
	else
	{
		printf("%d\n",Getgcd(a,num)); //最大公約數
	//	printf("最小公倍數:%d\n",GetLcm(a,num));
	}
	delete [] a;
	a=NULL;
	return 0;
}


第二題

實現一個開放的書名檢索庫

描述:

實現一個開放的書名檢索庫,庫中儲存了若干個書名

使用者可以:
    1、通過介面加入書名
    2、指定搜尋條件搜尋庫中符合條件的書名

重要格式說明
單詞:
    
由小寫英文字母組成,不含其它字元

書名:
    
由一個或多個單片語成
    當包含多個單詞時,單詞間用一個空格分隔

    第一個單詞前和最後一個單詞後沒有空格
    若只包含一個單詞,則該單詞前後均無空格

搜尋條件:
    1、由一個或多個不重複的關鍵字組成,每個關鍵字是一個單詞。
    2、當包含多個關鍵字時,關鍵字間用一個空格分隔;第一個關鍵字前和最後一個關鍵字後沒有空格
    3、若只包含一個關鍵字,則該關鍵字前後均無空格
    4、搜尋包含指定關鍵字的書名,輸出不需要排序(不影響自動閱卷)
5、若搜尋條件包含多個關鍵字,它們之間是“與”的關係即書名中要同時包含所有指定的關鍵字(但不限制關鍵字在書名中出現的位置和順序)
    6、必須是“全詞匹配”,即書名中的單詞和關鍵字完全一致,例如:關鍵字為man,書名中包括單詞woman,則不認為該書名符合搜尋要求

輸出說明:

   1. 如果沒有查詢到書名,那麼輸出一對雙引號: ""

   2. 如果存在多行輸出(查詢到多本書名),那麼輸出結果按字典序排序

舉例

輸入:

AddBooks
"high performance mysqlsecond edition"
"writing gnu emacs extensions"
"web client programming with perlautomating tasks"
"net test automation recipes a problem solution approach"
"photoreading"
"pro wfwindows workflow in net"
"aspect oriented analysis and design the theme approach"
SearchBooks 

"extensions gnu"

End

輸出:

"writing gnu emacs extensions"

輸入:

AddBooks
"high performance mysqlsecond edition"
"writing gnu emacsextensions"
"web client programming with perlautomating tasks"
"net test automation recipes a problem solution approach"
"photoreading"
"pro wfwindows workflow in net"
"aspect oriented analysis and design the theme approach"
SearchBooks

"approach"

End

輸出:

"aspect oriented analysis and design the theme approach"

"net test automation recipes a problem solution approach"

規格

 0<=書名個數範圍<=200 
    1<=書名所含單詞個數<=10
    1<=單詞所含字母數<=50
    1<=搜尋條件中關鍵字個數<=3

 

 

 

執行時間限制:

無限制

記憶體限制:

無限制

輸入:

AddBooks

[書名列表:每行一個書名,書名在雙引號中]

SearchBooks

[關鍵字:多個關鍵字用空格分隔,關鍵字在雙引號中]

End

 

輸出:

1. 查詢到的書名,查詢到多個書名,以多行顯示,書名在雙引號內

2. 如果沒有查詢到書名,那麼輸出: ""

3. 如果存在多行輸出(查詢到多本書名),那麼輸出結果按字典序排序

    如下:

    "aspect oriented analysis and design the theme approach"

    "net test automation recipes a problem solution approach"


    字母a 在字典序中排在字母n前面,所以顯示的時候 "aspect oriented analysis and design the theme approach"排在前面

    如果一個字元相等,那麼順序比較後面的字元,直到找到一個字元不相等為止

樣例輸入:

AddBooks

"high performance mysqlsecond edition"

"writing gnu emacs extensions"

"web client programming with perlautomating tasks"

"net test automation recipes a problem solution approach"

"photoreading"

"pro wfwindows workflow in net"

"aspect oriented analysis and design the theme approach"

SearchBooks

"extensions gnu"

End

樣例輸出:

"writing gnu emacs extensions"

答案提示:

 

 // C語言版  C++環境下編譯

#include <stdio.h>
#include <string.h>

 int stringcmp(const void *elem1, const void *elem2 )
 {
	return strcmp((char*)elem1,(char*)elem2);
 }
int main()
{
	char BookName[200][510];
	char searchkey[3][50];
	char strtmp[510];
	gets(strtmp);
	if(strcmp(strtmp,"AddBooks")!=0)
		return -1;
	int index=0;
	while(gets(strtmp)!=NULL)
	{	
		if(strcmp(strtmp,"SearchBooks")==0)
			break;
		else 
			strcpy(BookName[index++],strtmp);
	}
	int len1=index;
	index=0;
	int len2=0;
	while(gets(strtmp)!=NULL)
	{	
		if(strcmp(strtmp,"End")==0)
			break;
		else {	
			char *p=strtok(strtmp+1," \"");
			while(p){
				strcpy(searchkey[index++],p);
				p=strtok(NULL,"\"");
				len2++;
			}
		}
	}
	char pos[200][510]; 
	memset(pos,-1,sizeof(pos));
	bool flag[3];
	memset(flag,0,3);
	int k;
	index=0;
	for(int i=0;i<len1;i++)
	{	
		bool sum=true;
		memset(flag,0,3);
		k=0;
		for(int j=0;j<len2;j++)
		{	
			if(strstr(BookName[i],searchkey[j]))
				flag[k++]=true;
			else
				break;
		}
		for(k=0;k<len2;k++)
			sum &=flag[k];
		if(sum)
			strcpy(pos[index++],BookName[i]);
	}
	int len3=index;
	if(0==len3)
		puts("\"");
	else
	{
		qsort(pos,len3,510,stringcmp);
		for(k=0;k<len3;k++)
			puts(pos[k]);
	}
	
	return 0;
}

大華為的伺服器 太卡... 第二題沒測試。

C++版

//C++ 版 STL很強大
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> //sort
#include <sstream> // istringstream
using namespace std;


vector<string> Books;
vector<string> searchlist;

int main()
{
	string str;
	while(getline(cin,str) && str != "SearchBooks")
		Books.push_back(str);
	while(getline(cin,str) && str != "End")
	{	
		str = str.substr(1,str.size()-2);
		istringstream iss(str);
		while(iss>>str)
			searchlist.push_back(str);
	}
	vector<string>  rst;
	bool flag;
	for(int i=0;i < Books.size();i++)
	{	
		flag=true;
		for(int j=0; j<searchlist.size();j++)
		{
			if(strstr(Books[i].c_str(),searchlist[j].c_str()))
			{
				flag &= true;
				continue;
			}
			else flag &= false;
		}
		if(flag)
			rst.push_back(Books[i]);
	}
	if(rst.size()==0)
		cout<<"\"\""<<endl;
	else
	{
		sort(rst.begin(),rst.end());
		for(int k=0;k<rst.size();k++)
			cout<<rst[k]<<endl;
	}
	return 0;
}

相關文章