2019 上机试题
1.1 最长连续合数段
#include <iostream>
using namespace std;
bool isPrime ( int n) {
for ( int i= 2 ; i* i<= n; i++ )
if ( n% i== 0 ) return false ;
return true ;
}
int main ( ) {
int n, max= 0 , pos= - 1 , cnt= 0 ;
cin>> n;
for ( int i= 2 ; i<= n; i++ ) {
if ( ! isPrime ( i) ) cnt++ ;
else {
if ( cnt> max) {
max= cnt;
pos= i;
}
cnt= 0 ;
}
}
for ( int i= pos- max; i<= pos- 1 ; i++ )
cout<< i<< " " ;
return 0 ;
}
1.2 网络呈多叉树
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define MAX 150005
#define MOD 1000000007
typedef long long LL;
#define VM 1000010
#define inf 10000007
int que[ 1005 ] ;
int nd[ 1005 ] [ 8 ] ;
vector< int > dian;
void qxbl ( int root) {
if ( root!= - 1 ) {
if ( que[ root] == 3 )
dian. push_back ( root) ;
qxbl ( nd[ root] [ 0 ] ) ;
qxbl ( nd[ root] [ 1 ] ) ;
qxbl ( nd[ root] [ 2 ] ) ;
qxbl ( nd[ root] [ 3 ] ) ;
qxbl ( nd[ root] [ 4 ] ) ;
qxbl ( nd[ root] [ 5 ] ) ;
qxbl ( nd[ root] [ 6 ] ) ;
qxbl ( nd[ root] [ 7 ] ) ;
}
}
vector< int > g[ 1005 ] ;
int dis[ 1005 ] ;
int path[ 1005 ] ;
int bfs ( int st, int ed) {
queue< int > qu;
int i;
for ( i= 0 ; i< 1005 ; i++ ) dis[ i] = inf;
dis[ st] = 0 ;
qu. push ( st) ;
while ( ! qu. empty ( ) ) {
int v= qu. front ( ) ;
qu. pop ( ) ;
for ( i= 0 ; i< g[ v] . size ( ) ; i++ ) {
if ( dis[ g[ v] [ i] ] == inf) {
dis[ g[ v] [ i] ] = dis[ v] + 1 ;
path[ g[ v] [ i] ] = v;
if ( g[ v] [ i] == ed) return dis[ g[ v] [ i] ] ;
qu. push ( g[ v] [ i] ) ;
}
}
}
return inf;
}
int main ( )
{
int m, q, i, j, k;
int a[ 8 ] ;
int root;
int idx, id, zl;
scanf ( "%d" , & m) ;
for ( i= 0 ; i< m; i++ ) {
scanf ( "%d%d" , & idx, & zl) ;
que[ idx] = zl;
if ( i== 0 ) root= idx;
for ( j= 0 ; j< 8 ; j++ ) {
scanf ( "%d" , & id) ;
if ( id!= - 1 ) {
scanf ( "%d" , & zl) ;
que[ id] = zl;
g[ idx] . push_back ( id) ;
g[ id] . push_back ( idx) ;
}
nd[ idx] [ j] = id;
for ( k= 0 ; k< 8 ; k++ ) nd[ id] [ k] = - 1 ;
}
}
qxbl ( root) ;
int len= 0 , aim, ans, minn= MAX;
scanf ( "%d" , & aim) ;
for ( i= 0 ; i< dian. size ( ) ; i++ ) {
len = bfs ( dian[ i] , aim) ;
if ( len< minn) {
minn= len;
ans= i;
}
}
printf ( "%d %d\n" , dian[ ans] , minn) ;
return 0 ;
}
#include <iostream>
#include <list>
using namespace std;
#define PRINTER 2
typedef struct equipmentNode{
int id, type, parentId;
list< int > includeEquipId;
equipmentNode * myParent, * port1, * port2, * port3, * port4;
} * EquipmentNode;
int totalNums = 0 ;
int inputInfo[ 1000 ] [ 4 ] ;
list< EquipmentNode> equipList;
list< int > UpdateAllEquipArrivalPath ( EquipmentNode equip) {
list< int > valueList;
valueList. push_back ( equip- > id) ;
if ( equip- > type!= 0 ) return valueList;
int mySonNum= 0 ;
if ( equip- > port1!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , UpdateAllEquipArrivalPath ( equip- > port1) ) ;
}
if ( equip- > port2!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , UpdateAllEquipArrivalPath ( equip- > port2) ) ;
}
if ( equip- > port3!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , UpdateAllEquipArrivalPath ( equip- > port3) ) ;
}
if ( equip- > port4!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , UpdateAllEquipArrivalPath ( equip- > port4) ) ;
}
equip- > includeEquipId = valueList;
return valueList;
}
void ConnectEquipment ( EquipmentNode node) {
int childNum= 0 ;
int sonSums= 0 ;
int i= 0 ;
node- > port1 = NULL ;
node- > port2 = NULL ;
node- > port3 = NULL ;
node- > port4 = NULL ;
if ( node- > type == 1 || node- > type == 2 )
return ;
for ( i= 0 ; i< totalNums; i++ ) {
if ( inputInfo[ i] [ 2 ] == node- > id && node- > type== 0 ) {
EquipmentNode temp_node = new equipmentNode;
temp_node- > id = inputInfo[ i] [ 0 ] ;
temp_node- > type = inputInfo[ i] [ 1 ] ;
temp_node- > parentId = inputInfo[ i] [ 2 ] ;
temp_node- > myParent = node;
switch ( inputInfo[ i] [ 3 ] ) {
case 1 :
node- > port1 = temp_node;
break ;
case 2 :
node- > port2 = temp_node;
break ;
case 3 :
node- > port3 = temp_node;
break ;
case 4 :
node- > port4 = temp_node;
break ;
default :
break ;
}
ConnectEquipment ( temp_node) ;
}
}
}
int FindEquipmentTypeById ( int id) {
for ( list< EquipmentNode> :: iterator j= equipList. begin ( ) ; j!= equipList. end ( ) ; j++ ) {
if ( ( * j) - > id == id)
return ( * j) - > type;
}
return - 1 ;
}
EquipmentNode FindShortestPath ( EquipmentNode equip) {
int lastId= 0 ;
while ( true ) {
for ( list< int > :: iterator i= equip- > includeEquipId. begin ( ) ; i!= equip- > includeEquipId. end ( ) ; i++ ) {
if ( FindEquipmentTypeById ( * i) == PRINTER)
return equip;
}
if ( equip- > myParent == NULL ) return equip;
else {
lastId = equip- > id;
equip = equip- > myParent;
cout << lastId << "->" ;
}
}
}
void PreOrder ( EquipmentNode equip) {
equipList. push_back ( equip) ;
if ( equip- > port1 != NULL ) PreOrder ( equip- > port1) ;
if ( equip- > port2 != NULL ) PreOrder ( equip- > port2) ;
if ( equip- > port3 != NULL ) PreOrder ( equip- > port3) ;
if ( equip- > port4 != NULL ) PreOrder ( equip- > port4) ;
return ;
}
EquipmentNode returnSatifyEquipment ( EquipmentNode equip) {
if ( equip- > type == PRINTER) return equip;
else if ( equip- > type == 1 ) return NULL ;
else if ( equip- > port1 == NULL && equip- > port2== NULL && equip- > port3== NULL && equip- > port4== NULL ) return NULL ;
if ( equip- > port1 != NULL && equip- > port1- > type == PRINTER) return equip- > port1;
else if ( equip- > port2 != NULL && equip- > port2- > type == PRINTER) return equip- > port2;
else if ( equip- > port3 != NULL && equip- > port3- > type == PRINTER) return equip- > port3;
else if ( equip- > port4 != NULL && equip- > port4- > type == PRINTER) return equip- > port4;
EquipmentNode node = NULL ;
if ( equip- > port1 != NULL ) {
node = returnSatifyEquipment ( equip- > port1) ;
if ( node!= NULL && node- > type== PRINTER) return node;
}
if ( equip- > port2 != NULL ) {
node = returnSatifyEquipment ( equip- > port2) ;
if ( node != NULL && node- > type == PRINTER) return node;
}
if ( equip- > port3 != NULL ) {
node = returnSatifyEquipment ( equip- > port3) ;
if ( node != NULL && node- > type == PRINTER) return node;
}
if ( equip- > port4 != NULL ) {
node = returnSatifyEquipment ( equip- > port4) ;
if ( node != NULL && node- > type == PRINTER) return node;
}
return node;
}
void printPath ( EquipmentNode startNode, EquipmentNode endNode) {
cout << startNode- > id << "-->" ;
if ( startNode == endNode) return ;
if ( startNode- > port1!= NULL && std:: find ( startNode- > port1- > includeEquipId. begin ( ) ,
startNode- > port1- > includeEquipId. end ( ) , endNode- > id) != startNode- > port1- > includeEquipId. end ( ) )
printPath ( startNode- > port1, endNode) ;
else if ( startNode- > port2!= NULL && std:: find ( startNode- > port2- > includeEquipId. begin ( ) ,
startNode- > port2- > includeEquipId. end ( ) , endNode- > id) != startNode- > port2- > includeEquipId. end ( ) )
printPath ( startNode- > port2, endNode) ;
else if ( startNode- > port3!= NULL && std:: find ( startNode- > port3- > includeEquipId. begin ( ) ,
startNode- > port3- > includeEquipId. end ( ) , endNode- > id) != startNode- > port3- > includeEquipId. end ( ) )
printPath ( startNode- > port3, endNode) ;
else if ( startNode- > port4!= NULL && std:: find ( startNode- > port4- > includeEquipId. begin ( ) ,
startNode- > port4- > includeEquipId. end ( ) , endNode- > id) != startNode- > port4- > includeEquipId. end ( ) )
printPath ( startNode- > port4, endNode) ;
}
void printShortestPathToPrinter ( EquipmentNode equip) {
EquipmentNode printerEquip = returnSatifyEquipment ( equip) ;
printPath ( equip, printerEquip) ;
cout<< printerEquip- > id << endl;
cout<< "打印机Id为:" << printerEquip- > id;
}
int main ( ) {
cout << "请输入设备台数:" ;
cin >> totalNums;
cout << "依次输入每台设备,输入数据格式为:id, 类型(0:交换机,1:电脑 ,2:打印机), 父亲节点id(根的父亲节点为0), 端口号(1,2,3,4)" << endl;
int id, type, parentId, port;
for ( int i= 0 ; i< totalNums; i++ ) {
cin >> id >> type >> parentId >> port;
inputInfo[ i] [ 0 ] = id;
inputInfo[ i] [ 1 ] = type;
inputInfo[ i] [ 2 ] = parentId;
inputInfo[ i] [ 3 ] = port;
}
EquipmentNode root = new equipmentNode;
for ( int i= 0 ; i< totalNums; i++ ) {
if ( inputInfo[ i] [ 2 ] == 0 ) {
root- > parentId = 0 ;
root- > id = inputInfo[ i] [ 0 ] ;
root- > id = inputInfo[ i] [ 1 ] ;
}
}
ConnectEquipment ( root) ;
root- > includeEquipId = UpdateAllEquipArrivalPath ( root) ;
PreOrder ( root) ;
cout << "请输入要查找的ID:" ;
int findId;
while ( true ) {
cin >> findId;
list< EquipmentNode> :: iterator j;
for ( j = equipList. begin ( ) ; j!= equipList. end ( ) ; j++ )
if ( ( * j) - > id == findId) break ;
if ( j== equipList. end ( ) ) cout << "你输入的ID有误" ;
EquipmentNode findParent = FindShortestPath ( * j) ;
printShortestPathToPrinter ( findParent) ;
cout<< endl;
cout<< endl;
cout<< "请输入你要查找的ID:" ;
}
return 0 ;
}
8
1 0 0 0
2 0 1 1
3 0 1 2
4 0 1 3
5 1 4 3
6 1 3 1
7 2 3 2
8 2 3 3
2.1 最长的等差数列
#include <stdio.h>
#define N 1001
#define MAX_CHA 900
int num[ N] = { 0 } ;
int isPrime ( int n) {
if ( n<= 1 ) return 0 ;
for ( int i= 2 ; i* i<= n; i++ )
if ( n% i== 0 ) return 0 ;
return 1 ;
}
void getMax ( int num[ ] ) {
int cnt_temp;
int cnt_max = 0 ;
int diff_max= - 1 , start= - 1 ;
for ( int cha = 2 ; cha <= MAX_CHA; cha++ ) {
for ( int i = 101 ; i <= N; i++ ) {
cnt_temp = 0 ;
for ( int j = i; j <= N; j ++ ) {
for ( int k = j; k <= N; k + = cha) {
if ( num[ k] ) cnt_temp++ ;
else {
if ( cnt_temp > cnt_max) {
cnt_max = cnt_temp;
diff_max = cha;
start = j;
}
cnt_temp = 0 ;
break ;
}
}
}
}
}
for ( int i = 0 ; i < cnt_max; i++ ) {
printf ( "%d " , start) ;
start + = diff_max;
}
printf ( "\n" ) ;
}
int main ( void ) {
for ( int i= 2 ; i<= N; i++ )
if ( isPrime ( i) ) num[ i] = 1 ;
getMax ( num) ;
return 0 ;
}
2.2 机场三叉树
#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>
using namespace std;
typedef struct treeNode{
treeNode * leftNode;
treeNode * centerNode;
treeNode * rightNode;
treeNode * myParent;
int value, VipLevel;
list< int > ArrivalsNode;
} TreeNode;
list< TreeNode * > waitPassenger;
list< TreeNode * > waitPassengerSort;
int TotalFloor = 0 ;
int Input[ 1000 ] [ 4 ] ;
void CreateTree ( TreeNode* root) {
int childNum= 0 ;
int i= 0 ;
for ( i= 0 ; i< TotalFloor; i++ ) {
if ( Input[ i] [ 0 ] == root- > value) break ;
}
if ( Input[ i] [ 1 ] != 0 ) {
TreeNode * node = new TreeNode;
root- > leftNode = node;
node- > value = Input[ i] [ 1 ] ;
node- > myParent= root;
childNum++ ;
CreateTree ( node) ;
}
else root- > leftNode = NULL ;
if ( Input[ i] [ 2 ] != 0 ) {
TreeNode * node = new TreeNode;
root- > centerNode = node;
node- > value = Input[ i] [ 2 ] ;
node- > myParent = root;
childNum++ ;
CreateTree ( node) ;
}
else root- > centerNode = NULL ;
if ( Input[ i] [ 3 ] != 0 ) {
TreeNode * node = new TreeNode;
root- > rightNode = node;
node- > value = Input[ i] [ 2 ] ;
node- > myParent = root;
childNum++ ;
CreateTree ( node) ;
}
else root- > rightNode = NULL ;
if ( childNum== 0 )
waitPassenger. push_back ( root) ;
}
void PreOrder ( TreeNode* node) {
if ( node- > leftNode!= NULL ) PreOrder ( node- > leftNode) ;
if ( node- > centerNode!= NULL ) PreOrder ( node- > centerNode) ;
if ( node- > rightNode!= NULL ) PreOrder ( node- > rightNode) ;
return ;
}
void SortPassager ( ) {
list< int > VipLevel;
list< TreeNode* > :: iterator i;
for ( i= waitPassenger. begin ( ) ; i!= waitPassenger. end ( ) ; i++ )
VipLevel. push_back ( ( * i) - > value) ;
VipLevel. sort ( ) ;
list< int > :: iterator j;
for ( j= VipLevel. begin ( ) ; j!= VipLevel. end ( ) ; j++ ) {
for ( i= waitPassenger. begin ( ) ; i!= waitPassenger. end ( ) ; i++ ) {
if ( ( * i) - > value== * j)
waitPassengerSort. push_back ( * i) ;
}
}
}
list< int > InitAllNodeArrivalValue ( TreeNode * node) {
list< int > valueList;
valueList. push_back ( node- > value) ;
int mySonNum = 0 ;
if ( node- > leftNode!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , InitAllNodeArrivalValue ( node- > leftNode) ) ;
}
if ( node- > centerNode!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , InitAllNodeArrivalValue ( node- > centerNode) ) ;
}
if ( node- > rightNode!= NULL ) {
mySonNum++ ;
valueList. splice ( valueList. begin ( ) , InitAllNodeArrivalValue ( node- > rightNode) ) ;
}
valueList. sort ( ) ;
node- > ArrivalsNode = valueList;
return valueList;
}
TreeNode * FindParentIncludeNode ( TreeNode* curNode, TreeNode* endNode) {
cout << curNode- > value << "-->" ;
if ( curNode == endNode)
return curNode;
while ( true ) {
if ( std:: find ( curNode- > myParent- > ArrivalsNode. begin ( ) , curNode- > myParent- > ArrivalsNode. end ( ) , endNode- > value) != curNode- > myParent- > ArrivalsNode. end ( ) ) {
return curNode- > myParent;
}
else {
curNode = curNode- > myParent;
cout << curNode- > value << "-->" ;
}
}
}
void FindSonIncludeNode ( TreeNode* curNode, TreeNode* endNode, TreeNode root) {
if ( curNode== endNode) {
if ( curNode- > value == root. value) {
cout << endNode- > value << "回到出发点" ;
return ;
}
cout << endNode- > value << "到达" ;
return ;
}
if ( std:: find ( curNode- > ArrivalsNode. begin ( ) , curNode- > ArrivalsNode. end ( ) , endNode- > value) != curNode- > ArrivalsNode. end ( ) )
cout << curNode- > value << "-->" ;
if ( curNode- > leftNode != NULL )
FindSonIncludeNode ( curNode- > leftNode, endNode, root) ;
if ( curNode- > centerNode != NULL )
FindSonIncludeNode ( curNode- > centerNode, endNode, root) ;
if ( curNode- > rightNode != NULL )
FindSonIncludeNode ( curNode- > rightNode, endNode, root) ;
}
void Send ( TreeNode* curNode, TreeNode* sendNode, TreeNode root) {
cout<< endl<< "从" << curNode- > value<< "到" << sendNode- > value<< "的最短路径为:" ;
if ( std:: find ( curNode- > ArrivalsNode. begin ( ) , curNode- > ArrivalsNode. end ( ) , sendNode- > value) != curNode- > ArrivalsNode. end ( ) )
FindSonIncludeNode ( curNode, sendNode, root) ;
else {
TreeNode* nearParentNode = FindParentIncludeNode ( curNode, sendNode) ;
FindSonIncludeNode ( nearParentNode, sendNode, root) ;
}
}
int main ( ) {
cout << "请输入节点数:" ;
cin >> TotalFloor;
int rt, l, c, r;
for ( int i= 0 ; i< TotalFloor; i++ ) {
cin >> rt >> l >> c >> r;
Input[ i] [ 0 ] = rt;
Input[ i] [ 1 ] = l;
Input[ i] [ 2 ] = c;
Input[ i] [ 3 ] = r;
}
TreeNode* myRoot = new TreeNode;
myRoot- > value = Input[ 0 ] [ 0 ] ;
myRoot- > myParent = NULL ;
CreateTree ( myRoot) ;
cout<< endl;
int size = waitPassenger. size ( ) ;
list< int > ai= InitAllNodeArrivalValue ( myRoot) ;
PreOrder ( myRoot) ;
SortPassager ( ) ;
TreeNode * curNode = myRoot;
for ( list< TreeNode* > :: iterator node= waitPassengerSort. begin ( ) ; node!= waitPassengerSort. end ( ) ; node++ ) {
Send ( curNode, * node, * myRoot) ;
curNode = * node;
}
Send ( curNode, myRoot, * myRoot) ;
getchar ( ) ;
getchar ( ) ;
return 0 ;
}
2018
1.1 折线问题
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn= 1001 ;
struct segment{
int lx, ly, rx, ry;
int count;
} seg[ maxn] ;
int cmp1 ( segment a, segment b) {
return a. count> b. count;
}
int main ( ) {
int n;
scanf ( "%d" , & n) ;
for ( int i= 0 ; i< n; i++ ) {
scanf ( "%d%d%d%d" , & seg[ i] . lx, & seg[ i] . ly, & seg[ i] . rx, & seg[ i] . ry) ;
seg[ i] . count= 1 ;
}
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ ) {
if ( seg[ i] . rx== seg[ j] . lx&& seg[ i] . ry== seg[ j] . ly) {
seg[ i] . rx= seg[ j] . rx;
seg[ i] . ry= seg[ j] . ry;
seg[ j] . lx= seg[ i] . lx;
seg[ j] . ly= seg[ i] . ly;
seg[ i] . count+ = seg[ j] . count;
seg[ j] . count= seg[ i] . count;
}
else if ( seg[ j] . rx== seg[ i] . lx&& seg[ j] . ry== seg[ i] . ly) {
seg[ j] . rx= seg[ i] . rx;
seg[ j] . ry= seg[ i] . ry;
seg[ i] . lx= seg[ j] . lx;
seg[ i] . ly= seg[ j] . ly;
seg[ i] . count+ = seg[ j] . count;
seg[ j] . count= seg[ i] . count;
}
}
}
sort ( seg, seg+ maxn, cmp1) ;
printf ( "%d %d %d" , seg[ 0 ] . count, seg[ 0 ] . lx, seg[ 0 ] . ly) ;
return 0 ;
}
1.2 三叉树的建立
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn= 1001 ;
int preorder= 1 ;
struct NODE{
int l, m, r;
int data, layer;
int childnum, preorder;
} node[ maxn] ;
bool cmp1 ( NODE a, NODE b) {
if ( a. childnum!= b. childnum)
return a. childnum> b. childnum;
else {
if ( a. layer!= b. layer)
return a. layer> b. layer;
else
return a. preorder< b. preorder;
}
}
void layerOrder ( int root) {
queue< int > q;
node[ root] . layer= 1 ;
q. push ( root) ;
while ( ! q. empty ( ) ) {
int temp= q. front ( ) ;
q. pop ( ) ;
if ( ! node[ temp] . l) {
node[ node[ temp] . l] . layer= node[ temp] . layer++ ;
q. push ( node[ temp] . l) ;
}
if ( ! node[ temp] . m) {
node[ node[ temp] . m] . layer= node[ temp] . layer++ ;
q. push ( node[ temp] . m) ;
}
if ( ! node[ temp] . r) {
node[ node[ temp] . r] . layer= node[ temp] . layer++ ;
q. push ( node[ temp] . r) ;
}
}
}
void preOrder ( int root) {
node[ root] . preorder= preorder++ ;
if ( ! node[ root] . l)
preOrder ( node[ root] . l) ;
if ( ! node[ root] . m)
preOrder ( node[ root] . m) ;
if ( ! node[ root] . r)
preOrder ( node[ root] . r) ;
}
int main ( ) {
int n;
scanf ( "%d" , & n) ;
for ( int i= 0 ; i< n; i++ ) {
int temp, child[ 3 ] ;
scanf ( "%d" , & temp) ;
node[ temp] . childnum= 0 ;
for ( int j= 0 ; j< 3 ; j++ ) {
scanf ( "%d" , & child[ j] ) ;
if ( ! child[ j] )
node[ temp] . childnum++ ;
}
node[ temp] . data= temp;
node[ temp] . l= child[ 0 ] ;
node[ temp] . m= child[ 1 ] ;
node[ temp] . r= child[ 2 ] ;
}
layerOrder ( 1 ) ;
preOrder ( 1 ) ;
sort ( node+ 1 , node+ n+ 1 , cmp1) ;
int t= 1 ;
printf ( "%d %d\n" , node[ 1 ] . preorder, node[ 1 ] . data) ;
while ( node[ t+ 1 ] . childnum== node[ t] . childnum&& node[ t+ 1 ] . layer== node[ t] . layer) {
printf ( "%d %d\n" , node[ t+ 1 ] . preorder, node[ t+ 1 ] . data) ;
t++ ;
}
return 0 ;
}
2017
1.1 中位数
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp ( int a, int b) {
return a < b;
}
int main ( ) {
int n;
map< int , int > mp;
vector< int > v;
cin >> n;
for ( int i = 1 ; i <= n; i++ ) {
int temp;
cin >> temp;
mp[ temp] = i;
v. push_back ( temp) ;
}
sort ( v. begin ( ) , v. end ( ) , cmp) ;
if ( v. size ( ) % 2 == 1 ) {
int temp = v[ v. size ( ) / 2 ] ;
cout << temp << " " << mp[ temp] ;
} else {
int temp = v[ v. size ( ) / 2 - 1 ] ;
cout << temp << " " << mp[ temp] << endl;
temp= v[ v. size ( ) / 2 ] ;
cout << temp << " " << mp[ temp] ;
}
return 0 ;
}
1.2 查找未定义变量
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main ( ) {
vector< string> vars ( 100 ) ;
string current_var;
int var_index = 0 ;
bool recording_variable = true ;
bool recorded = false ;
string line;
current_var = "" ;
for ( int r = 0 ; r < 2 ; r++ ) {
getline ( cin, line) ;
if ( r == 1 ) {
recording_variable = true ;
recorded = false ;
current_var = "" ;
}
for ( int i = 0 ; i < line. length ( ) ; i++ ) {
if ( r == 0 && line[ i] == '*' )
continue ;
else if ( recording_variable && ( ( line[ i] >= 'A' && line[ i] <= 'Z' ) || ( line[ i] >= 'a' && line[ i] <= 'z' ) || ( line[ i] >= '0' && line[ i] <= '9' ) || line[ i] == '_' ) ) {
current_var + = line[ i] ;
recorded = true ;
}
else if ( line[ i] == '=' || line[ i] == '[' || line[ i] == ';' ) {
if ( recording_variable) {
if ( r == 0 ) vars[ var_index++ ] = current_var;
else {
bool flag = false ;
for ( int j = 0 ; j < var_index; ++ j) {
if ( vars[ j] == current_var) {
flag = true ;
break ;
}
}
if ( ! flag)
cout << current_var << ' ' ;
}
current_var = "" ;
recorded = false ;
}
if ( r == 0 )
recording_variable = false ;
}
else if ( line[ i] == ' ' ) {
if ( recording_variable && recorded) {
if ( r == 0 ) vars[ var_index++ ] = current_var;
else {
bool flag = false ;
for ( int j= 0 ; j< var_index; j++ ) {
if ( vars[ j] == current_var) {
flag= true ;
break ;
}
}
if ( ! flag)
cout<< current_var<< " " ;
}
current_var= "" ;
recorded= false ;
}
}
else if ( line[ i] == ',' || line[ i] == '+' || line[ i] == '-' || line[ i] == '*' || line[ i] == '/' ) {
if ( recording_variable) {
if ( r== 0 ) vars[ var_index++ ] = current_var;
else {
bool flag = false ;
for ( int j = 0 ; j < var_index; j++ ) {
if ( vars[ j] == current_var) {
flag = true ;
break ;
}
}
if ( ! flag)
cout << current_var << ' ' ;
}
current_var = "" ;
recorded= false ;
}
recording_variable = true ;
}
}
if ( r== 0 ) {
for ( int i= 0 ; i< var_index; i++ ) {
string s= "int" ;
if ( vars[ i] == s)
vars[ i] = "" ;
}
}
}
return 0 ;
}
1.3 找家谱成员
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef struct node{
char name[ 20 ] ;
int depth;
struct node * father;
} Node;
int main ( ) {
char s[ 1000 ] ;
int lineno = 0 ;
Node nodes[ 100 ] ;
memset ( nodes, 0 , sizeof ( nodes) ) ;
int node_index = 0 ;
while ( cin. getline ( s, 100 ) ) {
char names[ 3 ] [ 20 ] ;
int name_index = 0 , pos_index = 0 ;
memset ( names, 0 , sizeof ( names) ) ;
bool last_is_space = false ;
for ( int i = 0 ; i < strlen ( s) ; ++ i) {
if ( s[ i] == ' ' ) {
if ( ! last_is_space) {
name_index + = 1 ;
pos_index = 0 ;
last_is_space = true ;
}
}
else {
names[ name_index] [ pos_index++ ] = s[ i] ;
last_is_space = false ;
}
}
name_index + = 1 ;
if ( name_index == 3 ) {
if ( lineno == 0 ) {
strcpy ( nodes[ node_index] . name, names[ 0 ] ) ;
nodes[ node_index] . father = NULL ;
nodes[ node_index] . depth = 0 ;
node_index++ ;
}
for ( int i= 0 ; i < node_index; ++ i) {
if ( strcmp ( names[ 0 ] , nodes[ i] . name) == 0 ) {
for ( int j = 1 ; j < name_index; ++ j) {
strcpy ( nodes[ node_index] . name, names[ j] ) ;
nodes[ node_index] . father = & nodes[ i] ;
nodes[ node_index] . depth = nodes[ i] . depth + 1 ;
node_index++ ;
}
}
}
}
else {
Node * p0, * p1;
for ( int i = 0 ; i< node_index; ++ i) {
if ( strcmp ( names[ 0 ] , nodes[ i] . name) == 0 )
p0 = & nodes[ i] ;
if ( strcmp ( names[ 1 ] , nodes[ i] . name) == 0 )
p1 = & nodes[ i] ;
}
int d_depth = p0- > depth - p1- > depth;
while ( p0- > depth > p1- > depth)
p0 = p0- > father;
while ( p1- > depth > p0- > depth)
p1 = p1- > father;
while ( p0!= p1) {
p0 = p0- > father;
p1 = p1- > father;
}
cout << p0- > name << ' ' << abs ( d_depth) << endl;
}
lineno++ ;
}
return 0 ;
}
2016
1.1 逆序数
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main ( ) {
char str1[ 10 ] , str2[ 10 ] , len;
int n, m;
scanf ( "%s" , str1) ;
len= strlen ( str1) ;
for ( int i= 0 ; i< len; i++ )
str2[ i] = str1[ len- 1 - i] ;
str2[ len] = '\0' ;
n= stoi ( str1) ;
m= stoi ( str2) ;
if ( m% n== 0 )
printf ( "%s*%d=%s\n" , str1, m/ n, str2) ;
else
printf ( "%s %s\n" , str1, str2) ;
return 0 ;
}
1.2 enum输出
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
using namespace std;
#define INVALID 9999
const int LEN= 200 ;
char name[ LEN] [ LEN] ;
int num[ LEN] ;
int cur_Index= 0 ;
void parse ( char enumStr[ ] , int len) ;
char * TypeContent = ( char * ) malloc ( LEN) ;
int TypeContentLen = 0 ;
int lastPos = 0 ;
char * getTypeContent ( char enumStr[ ] , int len) ;
char eval ( char c) ;
void scan ( char enumStr[ ] , int & pos) ;
void parse ( char enumStr[ ] , int len) {
char * content = getTypeContent ( enumStr, len) ;
int BEG= 0 ;
while ( lastPos< TypeContentLen)
scan ( content, BEG) ;
}
char * getTypeContent ( char enumStr[ ] , int len) {
int i= 0 ;
int pos= 0 ;
while ( true ) {
if ( enumStr[ i] == '{' ) {
while ( i++ ) {
if ( enumStr[ i] == '}' ) {
TypeContent[ pos++ ] = '\0' ;
TypeContentLen= pos;
return TypeContent;
}
else
TypeContent[ pos++ ] = enumStr[ i] ;
}
}
i++ ;
}
return NULL ;
}
char eval ( char c) {
return c- '0' ;
}
void scan ( char enumStr[ ] , int & pos) {
int end = pos;
int i = 0 ;
while ( true ) {
if ( enumStr[ end] == ',' ) {
name[ cur_Index] [ i] = 0 ;
num[ cur_Index] = INVALID;
pos= end+ 1 ;
cur_Index++ ;
return ;
}
if ( enumStr[ end] == '=' ) {
name[ cur_Index] [ i] = 0 ;
while ( true ) {
end++ ;
if ( enumStr[ end] != ' ' ) {
num[ cur_Index] = atoi ( & enumStr[ end] ) ;
break ;
}
}
while ( true ) {
if ( end>= TypeContentLen) {
lastPos= TypeContentLen;
return ;
}
end++ ;
if ( enumStr[ end] == ',' )
break ;
}
pos= end+ 1 ;
cur_Index++ ;
return ;
}
name[ cur_Index] [ i++ ] = enumStr[ end++ ] ;
}
}
int count ( int num, int & preCount) {
if ( num!= INVALID) {
preCount= num;
return preCount;
} else {
preCount= preCount+ 1 ;
return preCount;
}
}
void print ( ) {
int i= 0 ;
int preCount= 0 ;
for ( int i= 0 ; i<= cur_Index; i++ )
printf ( "%s:%d" , name[ i] , count ( num[ i] , preCount) ) ;
}
int main ( ) {
for ( int i= 0 ; i< LEN; i++ )
num[ i] = INVALID;
char * enumStr = "enumdate{JAN=1, FEB, MAR, APR, MAY, JUN, JULY, AUG, SEP, OCT, NOV, DEC, MON=1, TUE, WED, THU, FRI, SAT, SUN, found=1949};" ;
parse ( enumStr, strlen ( enumStr) ) ;
print ( ) ;
getchar ( ) ;
getchar ( ) ;
return 0 ;
}
2015
1.1 求相亲数
#include <stdio.h>
int main ( ) {
int n, m, a[ 100 ] , b[ 100 ] , suma, sumb;
int s, t;
int i= 0 , j= 0 , k= 0 ;
suma= 0 ;
sumb= 0 ;
scanf ( "%d,%d" , & n, & m) ;
s= n;
t= m;
for ( i= 1 ; i<= n/ 2 ; i++ ) {
if ( n% i== 0 ) {
a[ k] = i;
k++ ;
}
}
a[ k] = - 1 ;
k= 0 ;
if ( m == 0 ) {
b[ k] = 0 ;
k++ ;
}
for ( i= 1 ; i<= m/ 2 ; i++ ) {
if ( m% i== 0 ) {
b[ k] = i;
k++ ;
}
}
b[ k] = - 1 ;
for ( i= 0 ; a[ i] != - 1 ; i++ )
suma + = a[ i] ;
if ( suma== m) {
for ( i= 0 ; b[ i] != - 1 ; i++ )
sumb+ = b[ i] ;
if ( sumb== n) {
printf ( "%d," , n) ;
for ( i= 0 ; a[ i] != - 1 ; i++ ) {
if ( a[ i+ 1 ] == - 1 ) printf ( "%d" , a[ i] ) ;
else printf ( "%d+" , a[ i] ) ;
}
printf ( "=%d\n" , m) ;
printf ( "%d," , m) ;
for ( i= 0 ; b[ i] != - 1 ; i++ ) {
if ( b[ i+ 1 ] == - 1 ) printf ( "%d" , b[ i] ) ;
else printf ( "%d+" , b[ i] ) ;
}
printf ( "=%d\n" , n) ;
printf ( "1\n" ) ;
return 0 ;
}
}
printf ( "0\n" ) ;
return 0 ;
}
1.2 模拟窗口叠放次序
#include <stdio.h>
int a[ 100 ] [ 5 ] ;
int s[ 100 ] [ 2 ] ;
void Update ( int a[ ] [ 5 ] , int n) {
int i, j, k, temp, p, x, y;
for ( i= 0 ; i< n; i++ ) {
k= i;
for ( j= i+ 1 ; j< n; j++ ) {
if ( s[ i] [ 1 ] > s[ j] [ 1 ] )
k= j;
}
if ( k!= i) {
x= - 1 ;
y= - 1 ;
for ( p= 0 ; p< n; p++ ) {
if ( a[ p] [ 0 ] == s[ i] [ 0 ] )
x= p;
if ( a[ p] [ 0 ] == s[ k] [ 0 ] )
y= k;
if ( x && y)
break ;
}
for ( p= 0 ; p< 5 ; p++ ) {
temp= a[ x] [ p] ;
a[ x] [ p] = a[ y] [ p] ;
a[ y] [ p] = temp;
}
}
}
for ( i= 1 ; i< n; i++ ) {
for ( j= 0 ; j< n&& j!= i; j++ ) {
if ( a[ i] [ 3 ] < a[ j] [ 3 ] && a[ j] [ 3 ] < a[ i] [ 1 ] )
a[ i] [ 3 ] = a[ j] [ 3 ] ;
else if ( a[ i] [ 2 ] < a[ j] [ 2 ] && a[ j] [ 2 ] < a[ i] [ 4 ] )
a[ j] [ 2 ] = a[ i] [ 4 ] ;
}
}
}
void Change ( int s[ ] [ 2 ] , int n, int k) {
int i, j;
s[ k] [ 1 ] = 1 ;
for ( i= 0 ; i< n && i!= k; i++ )
s[ i] [ 1 ] + = s[ i] [ 1 ] ;
}
int main ( ) {
int n, m, i, j, p, t;
int b[ 100 ] [ 2 ] , c[ 100 ] [ 5 ] ;
scanf ( "%d" , & n) ;
for ( i= 0 ; i< n; i++ ) {
for ( j= 0 ; j< 5 ; j++ ) {
scanf ( "%d" , & a[ i] [ j] ) ;
c[ i] [ j] = a[ i] [ j] ;
}
s[ i] [ 0 ] = a[ i] [ 0 ] ;
s[ i] [ 1 ] = i+ 1 ;
}
scanf ( "%d" , & m) ;
for ( i= 0 ; i< m; i++ ) {
for ( j= 0 ; j< 2 ; j++ )
scanf ( "%d" , & b[ i] [ j] ) ;
}
Update ( a, n) ;
for ( i= 0 ; i< m; i++ ) {
for ( j= 0 ; j< n; j++ ) {
if ( b[ i] [ 0 ] < a[ j] [ 1 ] && b[ i] [ 0 ] > a[ j] [ 3 ] ) {
Change ( s, n, i) ;
if ( i!= m- 1 ) {
for ( p= 0 ; p< n; p++ ) {
for ( t= 0 ; t< 5 ; t++ )
a[ p] [ t] = c[ p] [ t] ;
}
}
Update ( a, n) ;
}
}
}
for ( i= 0 ; i< n; i++ )
printf ( "%5d" , a[ i] [ 0 ] ) ;
printf ( "\n" ) ;
}
1.3 统计词语
#include <stdio.h>
#include <string.h>
char ch[ 10000 ] ;
char str[ 1000 ] [ 100 ] ;
void swap ( char a[ ] , char b[ ] ) {
int n, m, i, j, max;
char temp[ 100 ] ;
n= strlen ( a) ;
m= strlen ( b) ;
if ( m> n) {
for ( i= n; i< m; i++ )
a[ i] = ' ' ;
a[ i] = '\0' ;
}
if ( n> m) {
for ( i= m; i< n; i++ )
b[ i] = ' ' ;
b[ i] = '\0' ;
}
for ( i= 0 ; i< n; i++ )
temp[ i] = a[ i] ;
for ( i= 0 ; i< m; i++ )
a[ i] = b[ i] ;
a[ i] = '\0' ;
for ( i= 0 ; i< n; i++ )
b[ i] = temp[ i] ;
b[ i] = '\0' ;
}
int CompareTo ( char a[ ] , char b[ ] ) {
int n, m, i, j, min;
n= strlen ( a) ;
m= strlen ( b) ;
min= m< n? m: n;
for ( i= 0 ; i< min; i++ ) {
if ( a[ i] == b[ i] )
continue ;
if ( a[ i] > b[ i] )
return 1 ;
if ( a[ i] < b[ i] )
return - 1 ;
}
return 0 ;
}
int main ( ) {
int i, j, n, m, k, t, min;
FILE * fp= fopen ( "1.txt" , "r" ) ;
if ( ! fp) {
printf ( "can't open file\n" ) ;
return 0 ;
}
i= 0 ;
while ( ! feof ( fp) ) {
fscanf ( fp, "%c" , & ch[ i] ) ;
i++ ;
}
m= i;
k= 0 ;
for ( i= 0 ; i< m; i++ ) {
if ( ch[ i] == ',' || ch[ i] == '.' || ch[ i] == ' ' )
continue ;
else {
j= 0 ;
while ( ch[ i] != ',' && ch[ i] != '.' && ch[ i] != ' ' ) {
str[ k] [ j++ ] = ch[ i++ ] ;
if ( i== m)
break ;
}
str[ k] [ j] = '\0' ;
k++ ;
}
}
n= k;
min= 0 ;
for ( i= 0 ; i< n; i++ ) {
t= i;
for ( j= i+ 1 ; j< n; j++ ) {
k= CompareTo ( str[ t] , str[ j] ) ;
if ( k== 1 ) {
t= j;
}
}
if ( t!= i) {
swap ( str[ i] , str[ t] ) ;
}
}
printf ( "%s\n" , str[ 0 ] ) ;
for ( i= 1 ; i< n; i++ ) {
if ( CompareTo ( str[ i] , str[ i- 1 ] ) )
printf ( "%s\n" , str[ i] ) ;
}
return 0 ;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int cmp1 ( const void * a, const void * b) {
return strcmp ( ( char * ) a, ( char * ) b) < 0 ;
}
int main ( ) {
char s[ 1000 ] ;
char word[ 100 ] [ 20 ] ;
int count= 0 , last= 0 ;
int index_word= 0 ;
FILE * fp= fopen ( "/Users/lizhong/Documents/Xcode/ACM/ACM/ACM/1.txt" , "r" ) ;
if ( ! fp) {
printf ( "open fail!" ) ;
return 0 ;
}
while ( ! feof ( fp) ) {
fscanf ( fp, "%c" , & s[ count++ ] ) ;
}
s[ count] = '\0' ;
for ( int i= 0 ; i< count; i++ ) {
if ( s[ i] != ' ' && s[ i] != '.' && s[ i] != ',' ) {
word[ index_word] [ i- last] = s[ i] ;
} else {
word[ index_word] [ i- last] = '\0' ;
last= i+ 1 ;
index_word++ ;
}
}
sort ( word, word+ index_word, cmp1) ;
for ( int i= 0 ; i< index_word; i++ ) {
if ( i!= 0 && strcmp ( word[ i- 1 ] , word[ i] ) == 0 )
continue ;
printf ( "%s\n" , word[ i] ) ;
}
return 0 ;
}
2014
第一题 阶乘数
#include <cstdio>
using namespace std;
int fun ( int n) {
if ( n== 0 || n== 1 )
return 1 ;
else
return n* fun ( n- 1 ) ;
}
int main ( ) {
int n, a[ 100 ] ;
while ( ~ scanf ( "%d" , & n) ) {
int count= 0 , sum= 0 , temp= n;
while ( temp) {
a[ count++ ] = temp% 10 ;
temp/ = 10 ;
}
printf ( "%d," , n) ;
for ( int i= count- 1 ; i>= 0 ; i-- ) {
if ( i== count- 1 )
printf ( "%d!" , a[ i] ) ;
else
printf ( "+%d!" , a[ i] ) ;
sum+ = fun ( a[ i] ) ;
}
printf ( "=%d\n" , sum) ;
if ( n== sum)
printf ( "Yes\n" ) ;
else
printf ( "No\n" ) ;
}
return 0 ;
}
第二题 五子棋
#include <cstdio>
using namespace std;
const int maxn= 19 ;
int v[ 19 ] [ 19 ] , minx, miny;
int judge ( int m, int n) {
int count;
int t= v[ m] [ n] ;
int x, y;
count= 1 ;
x= m; y= n;
while ( x< maxn- 1 ) {
if ( v[ ++ x] [ y] == t)
count++ ;
else
break ;
}
x= m; y= n;
while ( x> 0 ) {
if ( v[ -- x] [ y] == t)
count++ ;
else
break ;
}
if ( count>= 5 ) {
minx= x;
miny= y;
return t;
}
count= 1 ;
x= m; y= n;
while ( y< maxn- 1 ) {
if ( v[ x] [ ++ y] == t)
count++ ;
else
break ;
}
x= m; y= n;
while ( y> 0 ) {
if ( v[ x] [ -- y] == t)
count++ ;
else
break ;
}
if ( count>= 5 ) {
minx= x;
miny= y;
return t;
}
count= 1 ;
x= m; y= n;
while ( x< maxn- 1 && y< maxn- 1 ) {
if ( v[ x+ 1 ] [ y+ 1 ] == t)
count++ ;
else
break ;
}
x= m; y= n;
while ( x> 0 && y> 0 ) {
if ( v[ -- x] [ -- y] == t)
count++ ;
else
break ;
}
if ( count>= 5 ) {
minx= x;
miny= y;
return t;
}
count= 1 ;
x= m; y= n;
while ( x< maxn- 1 && y> 0 ) {
if ( v[ ++ x] [ -- y] == t)
count++ ;
else
break ;
}
x= m; y= n;
while ( x> 0 && y< maxn- 1 ) {
if ( v[ -- x] [ ++ y] == t)
count++ ;
else
break ;
}
if ( count>= 5 ) {
minx= x;
miny= y;
return t;
}
return 0 ;
}
int main ( ) {
int temp= 0 ;
for ( int i= 0 ; i< maxn; i++ )
for ( int j= 0 ; j< maxn; j++ )
scanf ( "%d" , & v[ i] [ j] ) ;
for ( int i= 0 ; i< maxn; i++ ) {
for ( int j= 0 ; j< maxn; j++ ) {
if ( v[ i] [ j] )
temp= judge ( i, j) ;
if ( temp)
break ;
}
if ( temp)
break ;
}
switch ( temp) {
case 1 : printf ( "1获胜(%d,%d)\n" , minx, miny) ;
break ;
case 2 : printf ( "2获胜(%d,%d)\n" , minx, miny) ;
break ;
case 0 : printf ( "无人获胜\n" ) ;
break ;
default :
break ;
}
return 0 ;
}
第三题 排版题
2013
第一题 真分数约分
#include <cstdio>
#include <algorithm>
using namespace std;
int main ( ) {
int m, n;
while ( ~ scanf ( "%d%d" , & n, & m) ) {
int minx= min ( m, n) ;
for ( int i= 2 ; i<= minx; i++ ) {
while ( m% i== 0 && n% i== 0 ) {
m/ = i;
n/ = i;
minx/ = i;
}
}
printf ( "%d %d\n" , n, m) ;
}
return 0 ;
}
第二题 简单版八皇后
第二题 科学计数法
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main ( ) {
char s[ 100 ] ;
char number[ 100 ] ;
while ( ~ scanf ( "%s" , s) ) {
int len= ( int ) strlen ( s) ;
int index_sign= len, index_number= 0 ;
int flag= 0 , count= 0 ;
for ( int i= 0 ; i< len; i++ ) {
if ( s[ i] >= '1' && s[ i] <= '9' ) {
if ( ! flag)
index_number= i;
flag= 1 ;
number[ count++ ] = s[ i] ;
}
else if ( s[ i] == '.' ) {
index_sign= i;
}
else if ( s[ i] == '0' && flag) {
number[ count++ ] = s[ i] ;
}
}
printf ( "%c." , number[ 0 ] ) ;
for ( int i= 1 ; i< count; i++ )
printf ( "%c" , number[ i] ) ;
int temp= index_sign- index_number;
if ( temp> 0 )
temp- = 1 ;
printf ( "e%d\n" , temp) ;
}
return 0 ;
}
2012
第一题
#include <iostream>
using namespace std;
int main ( ) {
int n;
while ( ~ scanf ( "%d" , & n) ) {
int flag= 0 ;
for ( int i= 1 ; i< n; i++ ) {
for ( int j= i+ 1 ; j< n; j++ ) {
int sum= ( i+ j) * ( j- i+ 1 ) / 2 ;
if ( sum== n) {
flag= 1 ;
printf ( "%d=%d" , n, i) ;
for ( int r= i+ 1 ; r<= j; r++ )
printf ( "+%d" , r) ;
printf ( "\n" ) ;
}
}
}
if ( flag== 0 )
printf ( "NONE\n" ) ;
}
return 0 ;
}
第二题
#include <iostream>
using namespace std;
int main ( ) {
int n;
while ( ~ scanf ( "%d" , & n) ) {
int s[ n] [ n] ;
for ( int i= 0 ; i< n; i++ )
for ( int j= 0 ; j< n; j++ )
scanf ( "%d" , & s[ i] [ j] ) ;
}
return 0 ;
}
第三题
2011
第一题 孪生数
#include <stdio.h>
#include <string.h>
int sum ( int n) {
int num= 0 ;
for ( int i= 1 ; i< n; i++ )
if ( n% i== 0 )
num+ = i;
return num;
}
int main ( ) {
int m, n;
while ( scanf ( "%d %d" , & m, & n) != EOF ) {
int flag= 0 , book[ 2000 ] ;
memset ( book, 0 , sizeof ( book) ) ;
for ( int i= m; i< n; i++ ) {
int temp= sum ( i) ;
if ( temp<= n&& sum ( temp) == i&& i!= temp&& ! book[ i] && ! book[ temp] ) {
printf ( "%d %d " , i, temp) ;
book[ temp] = 1 ;
book[ i] = 1 ;
flag= 1 ;
}
}
if ( flag== 0 )
printf ( "NONE" ) ;
printf ( "\n" ) ;
}
return 0 ;
}
第二题 矩阵替换
第三题 扩展字符串
#include <cstdio>
#include <cstring>
int main ( ) {
char s[ 1000 ] ;
while ( scanf ( "%s" , s) != EOF ) {
int len= ( int ) strlen ( s) ;
printf ( "%c" , s[ 0 ] ) ;
for ( int i= 1 ; i< len- 1 ; i++ ) {
if ( s[ i] == '-' ) {
if ( ( s[ i- 1 ] >= '0' && s[ i- 1 ] <= '9' && s[ i+ 1 ] >= '0' && s[ i+ 1 ] <= '9' ) || ( s[ i- 1 ] >= 'a' && s[ i- 1 ] <= 'z' && s[ i+ 1 ] >= 'a' && s[ i+ 1 ] <= 'z' ) || ( s[ i- 1 ] >= 'A' && s[ i- 1 ] <= 'Z' && s[ i+ 1 ] >= 'A' && s[ i+ 1 ] <= 'Z' ) ) {
char ch= s[ i- 1 ] + 1 ;
while ( ch< s[ i+ 1 ] ) {
printf ( "%c" , ch++ ) ;
}
}
}
else
printf ( "%c" , s[ i] ) ;
}
printf ( "%c\n" , s[ len- 1 ] ) ;
}
return 0 ;
}
2010
第一题 泰勒公式
第二题 归并两个有序的字符串
2009
第一题
#include <stdio.h>
int main ( ) {
double x, y;
int n;
while ( ~ scanf ( "%lf%d" , & x, & n) ) {
y= x;
for ( int i= 1 ; i<= n; i++ )
y= y* 2 / 3 + x/ ( 3 * y* y) ;
printf ( "%.6lf\n" , y) ;
}
return 0 ;
}
第二题 数组排序
第三题
2008
第一题
#include <stdio.h>
int isPrime ( int n) {
if ( n<= 1 )
return 0 ;
for ( int i = 2 ; i * i <= n; i++ ) {
if ( n % i == 0 )
return 0 ;
}
return 1 ;
}
int main ( ) {
int n, flag= 0 ;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ ) {
int temp= i% 10 ;
if ( isPrime ( i) && temp== 1 ) {
printf ( "%d " , i) ;
flag= 1 ;
}
}
if ( flag== 0 )
printf ( "-1\n" ) ;
return 0 ;
}
第二题
第三题
#include <cstdio>
#include <cstring>
using namespace std;
char s[ 100 ] ;
char a[ 100 ] [ 100 ] ;
int cmp ( char a, char b) {
if ( a>= '0' && a<= '9' && a== b)
return 1 ;
else if ( a>= 'a' && a<= 'z' && ( a== b|| ( a+ 'A' - 'a' ) == b) )
return 1 ;
else if ( a>= 'A' && a<= 'Z' && ( a== b|| ( a+ 'a' - 'A' ) == b) )
return 1 ;
else
return 0 ;
}
int main ( ) {
int n, m, flag;
scanf ( "%d" , & n) ;
for ( int i= 0 ; i< n; i++ )
scanf ( "%s" , a[ i] ) ;
scanf ( "%s" , s) ;
m= ( int ) strlen ( s) ;
for ( int i= 0 ; i< n; i++ ) {
int len= ( int ) strlen ( a[ i] ) ;
for ( int j= 0 , k= 0 ; j< len, k< m; j++ , k++ ) {
if ( cmp ( a[ i] [ j] , s[ k] ) )
continue ;
else {
if ( s[ k] != '[' )
goto out;
else {
flag= 0 ;
k++ ;
while ( s[ k] != ']' ) {
if ( cmp ( a[ i] [ j] , s[ k] ) )
flag= 1 ;
k++ ;
}
if ( flag== 0 )
goto out;
}
}
}
out:
if ( ( j== len) && ( k== m) )
printf ( "%d %s" )
}
return 0 ;
}
2007
第一题
#include <stdio.h>
int main ( ) {
char ch;
int space= 0 , enter= 0 , tab= 0 ;
while ( ( ch= getchar ( ) ) != '#' ) {
switch ( ch) {
case ' ' : space++ ;
break ;
case '\n' : enter++ ;
break ;
case '\t' : tab++ ;
break ;
default :
break ;
}
}
printf ( "%d %d %d\n" , space, enter, tab) ;
return 0 ;
}
2006
第一题
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int cmp ( const void * a, const void * b) {
return * ( int * ) a< * ( int * ) b;
}
int main ( ) {
int a[ 1001 ] , b[ 1001 ] , len1, len2;
scanf ( "%d" , & len1) ;
for ( int i= 0 ; i< len1; i++ )
scanf ( "%d" , & a[ i] ) ;
scanf ( "%d" , & len2) ;
for ( int i= 0 ; i< len2; i++ )
scanf ( "%d" , & b[ i] ) ;
qsort ( a, len1, sizeof ( int ) , cmp) ;
qsort ( b, len2, sizeof ( int ) , cmp) ;
int i= 0 , j= 0 ;
while ( i< len1&& j< len2) {
if ( a[ i] == a[ i+ 1 ] && i+ 1 < len1)
i++ ;
if ( b[ j] == b[ j+ 1 ] && j+ 1 < len2)
j++ ;
if ( a[ i] == b[ j] ) {
i++ ;
j++ ;
}
}
if ( i== len1&& j== len2)
printf ( "equal!\n" ) ;
else
printf ( "no equal!\n" ) ;
return 0 ;
}