全国软件大赛决赛题目(附答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国软件大赛决赛题目(附答案)
题1,高分值题(41分)
字符串分割:已知某文件中存在一些字符串及其对应的权值,现输入一个较长的字符串,找出各种匹配种类,并计算相应的权值和。
例如:(文件的内容)
a 5
aa 12
bc 9
bcd 21
cd 15
输入字符串:aaabc
相应的输出为:
a a a bc 24
a aa bc 26
aa a bc 26
///////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
#include <iomanip>
using namespace std;
int stringToCharVector(string str, vector<char> &v);
void searchAll(const string &souStr, vector<string> &comStr, vector<string> &resultStr,\
string:: iterator sou_sIt, vector<string>::iterator &result_sIt);
int main()
{
string souStr = "aaabc";
string comString[] = {"a","aa", "bc"}; vector<string> comStr (comString+0, comString+3);
vector<string> resultStr(1, "begin"); string::iterator sou_sIt = souStr.begin(); vector<string>::iterator result_sIt = resultStr.begin();
searchAll(souStr, comStr, resultStr, sou_sIt, result_sIt);
return 0;
}
/*******************************功能函数部分********************************/
int stringToCharVector(string str, vector<char> &v)
{
string::iterator sIt = str.begin();
v.clear();
while( sIt != str.end())
{
v.push_back(*(sIt++));
}
return 0;
}
void searchAll(const string &souStr, vector<string> &comStr, vector<string> &resultStr, \
string:: iterator sou_sIt, vector<string>::iterator &result_sIt)
{
if(sou_sIt == souStr.end())
{
int sumPower = 0;
for(vector<string>::iterator
result_begin_sIt = resultStr.begin(); \
result_begin_sIt < result_sIt; result_begin_sIt++)
{
cout<<*result_begin_sIt<<" ";
if(*result_begin_sIt == "a")
sumPower += 5;
else if(*result_begin_sIt == "aa")
sumPower += 12;
else if(*result_begin_sIt == "bc")
sumPower += 9;
else if(*result_begin_sIt == "bcd")
sumPower += 21;
else if(*result_begin_sIt == "cd")
sumPower += 15;
}
cout<<sumPower<<endl;
return;
}
for(vector<string>::iterator com_begin_sIt = comStr.begin(); com_begin_sIt < comStr.end(); com_begin_sIt++ )
{
int comStringLenth = (*(com_begin_sIt)).size();
int souStringLastLenth = souStr.end() - sou_sIt;
if(comStringLenth > souStringLastLenth) break;
int bitSouString = souStr.size() -
souStringLastLenth;
string partSouString = souStr.substr(bitSouString, comStringLenth);
if(partSouString == *com_begin_sIt)
{
int k;
if(result_sIt == resultStr.end())
{
result_sIt = resultStr.insert(result_sIt, *com_begin_sIt);
}
else
*result_sIt = *com_begin_sIt;
for(k = comStringLenth; k > 0; k--)
{
sou_sIt++;
}
searchAll(souStr, comStr, resultStr, sou_sIt, ++result_sIt );
for(k = comStringLenth; k > 0; k--)
{
sou_sIt--;
}
result_sIt--;
}
}
}
题2,中分值题(21分)
数字黑洞问题:任意一个五位数,调整其各位数字,分别组成一个最大数字和一个最小数字;将其差值再作为新的数(如果不足5位,则前边补0),再次进行上一操作,直到出现循环。
例如41679,首次得差值82962,继续进行,则产生75933,63954,61974。
由此构成一个循环数。
例如本题:
输入:41679
输出:[82962,75933,63954,61974]
请编程实现,输出所有五位数的循环圈。
///////////////////////////////////////////////////////////
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
///冒泡排序法
void sortBullet(int arry[], int n)
{
int flag;
for(int j= 1; j < n; j++)
{
flag = 0;
for(int i = 1; i < n; i++)
{
if(arry[i - 1] > arry[i])
{
int tmp = arry[i];
arry[i] = arry[i - 1];
arry[i -1] = tmp;
flag++;
}
}
if(flag == 0) break;
}
}
long getMax(int arry[])
{
long Max = 0;
for(int i = 4; i >= 0; i--)
{
Max += arry[i]*pow(10, i); }
return Max;
}
long getMin(int arry[])
{
long Max = 0;
for(int i = 0; i <= 4 ; i++)
{
Max += arry[i]*pow(10, 4-i);
}
return Max;
}
void longToIntArry(long num, int arry[]) {
for(int i = 0; i< 5; i++)
{
arry[i] = 0;
}
queue<int> numqueue;
while(1)
{
int n = num%10;
numqueue.push(n);
if( num < 10) break;
num = num/10;
}
int j = 4;
while(!numqueue.empty())
{
int elem;
elem = numqueue.front();
numqueue.pop();
arry[j] = elem;
j--;
}
}
int compareArry(long num1, long num2) {
int Arry1[5], Arry2[5]; longToIntArry(num1, Arry1); longToIntArry(num2, Arry2); sortBullet(Arry1, 5);
sortBullet(Arry2, 5);
for(int i = 0 ; i < 5; i++)
{
if(Arry1[i] != Arry2[i]) return 0;
}
return 1;
}
int judgeBreak(vector<long> &numArry, long numDiffer)
{
vector<long>::iterator sIt = numArry.begin(); while(sIt != numArry.end())
{
if(compareArry(*sIt, numDiffer)) return 1;
sIt++;
}
return 0;
}
///////////////////////////////////主函数部分
int main()
{
//long number ;//= 41679 ;
vector<long> numMery;
for(long number = 10000 ; number <= 99999; number++)
{
int numArry[5];
cout<<number<<" : ";
longToIntArry(number, numArry);
/*for(int I= 0; I < 5; I++)
{
cout<<numArry[I];
}*/
int test = 0;
long numMax, numMin;
numMery.clear();
numMery.push_back(number);
while(1)
{
sortBullet(numArry, 5);
numMax = getMax(numArry);
numMin = getMin(numArry);
//cout<<numMax<<" "<<numMin;
long numDiffer = numMax - numMin;
cout<<numDiffer<<", ";
if(judgeBreak(numMery, numDiffer)) break;
numMery.push_back(numDiffer);
longToIntArry(numDiffer, numArry);
//if( test > 3)
//break;
//test++;
}
cout<<endl;
}
return 0;
}
题3,中分值题(15分)
某单位将要组织一次旅游,已知各成员及其目的地(见“人员信息.txt”),要求根据人员信息,将各地的成员信息统一列出,以供统筹安排,并将结果输出到文件“人员信息2.txt”中。
注:题中不要求城市,或人员信息的顺序。
//人员信息.txt的内容如下(应为一个单独的文本文件):
赵一,北京
钱二,上海
孙三,南京
李四,北京
周小五,西安
吴天,南京
郑小七,上海
赵八,北京
王心凌,天津
刀郎,北京
例本题的输出应为:北京
4
刀郎
李四
赵八
赵一
上海
2
钱二
郑小七
南京
2
孙三
吴天
西安
1
周小五
天津
1
王心凌
///////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <stdlib.h>
#include <fstream>
using namespace std;
void charToString(const char *pt, vector<string> &strV)
{
strV.clear();
string str(pt);
for(int n = 0; n < str.size(); )
{
string charStr = str.substr(n, 2);
strV.push_back(charStr);
n=n+2;
}
}
class City
{
public:
City():num(0){}
int num;
string clientName[7][3];
};
int main()
{
City Beijing;
City Shanghai;
City Nanjing;
City Tianjing;
City Xi_an;
ifstream file("人员信息.txt"); ofstream file2("人员信息2.txt"); vector<string> strV;
char buffer[20];
while(!file.eof())
{
file.getline(buffer, 16);
charToString(buffer, strV);
int j;
for(int i = 0; i < 3; i++)
{
if(strV[i] == ",") break;
}
if("北京" == strV[i+1] + strV[i+2])
{
for(j = 0; j < i; j++)
Beijing.clientName[Beijing.num][j] = strV[j];
Beijing.num++;
}
else if("上海" == strV[i+1] + strV[i+2])
{
for(j = 0; j < i; j++)
Shanghai.clientName[Shanghai.num][j] = strV[j];
Shanghai.num++;
}
else if("南京" == strV[i+1] + strV[i+2])
{
for(j = 0; j < i; j++)
Nanjing.clientName[Nanjing.num][j] = strV[j];
Nanjing.num++;
}
else if("天津" == strV[i+1] + strV[i+2])
{
for(j = 0; j < i; j++)
Tianjing.clientName[Tianjing.num][j] = strV[j];
Tianjing.num++;
}
else if("西安" == strV[i+1] + strV[i+2])
{
for(j = 0; j < i; j++)
Xi_an.clientName[Xi_an.num][j] = strV[j];
Xi_an.num++;
}
}
int NUM;
int namecounter;
file2<<"北京"<<"\n"<<Beijing.num<<"\n"; for(NUM = 0; NUM < Beijing.num ; NUM++) {
for(namecounter = 0; namecounter < 3; namecounter++)
file2<<Beijing.clientName[NUM][namecounte r];
file2<<"\n";
}
file2<<"\n";
file2<<"上海"<<"\n"<<Shanghai.num<<"\n";
for(NUM = 0; NUM <Shanghai.num ; NUM++)
for(namecounter = 0; namecounter < 3; namecounter++)
file2<<Shanghai.clientName[NUM][namecou nter];
file2<<"\n";
}
file2<<"\n";
file2<<"南京"<<"\n"<<Nanjing.num<<"\n"; for(NUM = 0; NUM <Nanjing.num ; NUM++) {
for(namecounter = 0; namecounter < 3; namecounter++)
file2<<Nanjing.clientName[NUM][namecount er];
file2<<"\n";
file2<<"\n";
file2<<"天津"<<"\n"<<Tianjing.num<<"\n"; for(NUM = 0; NUM < Tianjing.num ; NUM++)
{
for(namecounter = 0; namecounter < 3; namecounter++)
file2<<Tianjing.clientName[NUM][namecoun ter];
file2<<"\n";
}
file2<<"\n";
file2<<"西安"<<"\n"<<Xi_an.num<<"\n"; for(NUM = 0; NUM <Xi_an.num ; NUM++) {
for(namecounter = 0; namecounter < 3; namecounter++)
file2<<Xi_an.clientName[NUM][namecounter ];
file2<<"\n";
}
}
题4,中分值题(9分)
日常生活中,人们往往被要求输入银行步号,例如:
卡号:313456789876505201 (红色标识为奇数位)
如此长的一串数字,让计算机来直接检验其是否
合法,也是很不方便的,因而常采用“lnr”算法,它做如下规定:
(1)将其奇数位数字相加求和;
(2)将其偶数位数字乘以2,若为两位数,则减去9,累加求和;
(3)将上述两累加和相加,若能被10整除,则表明合法。
例如对于本题:
奇数位和为:36
偶数位和为:34
总和为:34+36 = 70,可被10整除。
现要求,输入一个卡号,按如上算法,若通过,输出“成功”,反之,输出“失败”。
///////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
#include <iostream>
#include <conio.h>
using namespace std;
int charToInt(char a)
{
return a-'0';
}
int main()
{
vector<int> cardNum;
char a;
while((a= getch() )!= '\r')
{
if( a >= '0' && a <= '9')
{
cardNum.push_back(charToInt(a));
cout<<a;
}
}
int chooseBrench = 0;
int sum1 = 0;
int sum2 =0;
vector<int>::iterator sIt = cardNum.begin(); while(1)
{
if(sIt == cardNum.end()) break;
if(chooseBrench%2)
{
sum1 += *sIt;
chooseBrench--;
sIt++;
}
else
{
if((*sIt)*2 >= 10)
sum2 += ((*sIt)*2 - 9);
else
sum2+= ((*sIt)*2);
chooseBrench++;
sIt++;
}
}
cout<<endl;
if((sum1+ sum2)%10)
{
cout<<"失败"<<endl;
}
else
cout<<"成功"<<endl;
return 0;
}
题5,低分值题(5分)
日常生活中,人们打电话时,常按分,秒计时,例如接通时为12:33,挂机时为14:05,则实际通话为92秒。
不考虑跨小时的情况,也不考虑用户输入错误的情况。
请根据输入的两时间,计算相应的通话时
间。
///////////////////////////////////////////////////////////
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <vector>
using namespace std;
int charToInt(char a)
{
return a - '0';
}
int main()
{
vector<char> charStr;
char a;
while((a = getch()) != '\r')
{
if( (a >= '0' && a <= '9') || a == ':' || a == ' ' )
{
charStr.push_back(a);
cout<<a;
}
}
int stratMin, stratSec, endMin, endSec;
int ifBreak = 0;
for( int i = 0; ; i++)
{
if(ifBreak > 1) break;
if(charStr[i] == ':' && i < 3)
{
ifBreak++;
if(i == 1)
stratMin = charToInt(charStr[0]);
else
stratMin = charToInt(charStr[0])*10 + charToInt(charStr[1]);
stratSec = charToInt(charStr[i+1])*10 + charToInt(charStr[i+2]);
}
if(charStr[i] ==':' && i >3)
{
ifBreak++;
if(charStr[i -2] >= '0' && charStr[i-2] <= '9')
endMin = charToInt(charStr[i-2])*10 + charToInt(charStr[i-1]);
else
endMin = charToInt(charStr[i-1]);
endSec = charToInt(charStr[i+1])*10 + charToInt(charStr[i+2]);
}
}
cout<<endl;
int sumSec = (endMin - stratMin)*60 + (endSec-stratSec);
cout<<sumSec;
return 0;
}
题6,低分值题(4分)
忘了,不过是送分题。
///////////////////////////////////////////////////////////
题7,低分值题(3分)
生活中,人们对各事物的计量为数字+单位。
例如,某物品的重量为:3.45kg。
现要求编程实现,
数字与单位的分离。
例如:
输入:3.45kg
输出:3.45
kg
/////////////////////////////////////////////////////////// #include <stdio.h>
#include <conio.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
char a;
vector<char> str;
while((a=getch()) != '\r')
{
str.push_back(a);
cout<<a;
}
cout<<endl;
vector<char>::iterator sIt = str.begin(); while(sIt != str.end())
{
if((*sIt>= '0' && *sIt <= '9' ) || *sIt == '.') {
cout<<*sIt;
sIt++;
}
else break;
}
cout<<endl;
while(sIt != str.end())
{
cout<<*sIt;
sIt++;
}
cout<<endl;
return 0;
}
题8,低分值题(2分)
编程输出今年有多少毫秒(提示:今年不是闰年)。
cout<<364*24*6*6*1<<"00000"<<endl;。