给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。
循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如:
1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110
第一行是个整数n, 0 < n < 300000,表示后面还有n行数据
后面是n行,每行有两个不大于65535的非负整数
对于每一行的两个整数,输出一行,内容为YES或NO
4 2 4 9 18 45057 49158 7 12
YES YES YES NO
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
)(rttyy())sss)(
)(rttyy())sss)( ? ?$
#include "iostream" #include "string" #include "stack" using namespace std; void BracketMatch(const string srcStr); int main() { string str; while (cin >> str) { cout << str << endl; BracketMatch(str); } return 0; } void BracketMatch(const string srcStr) { stack<int> s; string ansStr(srcStr.length(),'0'); for (unsigned int i = 0; i < srcStr.length(); i++)//从左往右开始遍历 { if (isalpha(srcStr[i])) { ansStr[i]=' '; continue; } switch (srcStr[i]) { //对左括号仅作压栈处理,也就是说栈中只可能是左括号 case '(': if (i != (srcStr.length() - 1))//当是最后一个字符时已经没有必要输出空格了 ansStr[i] = ' '; s.push(i);//注意,这里 break; //对右括号做匹配判断 case ')': if (!s.empty()) {//如果不为空,说明一定有左括号(实际上是其数组下标) s.pop(); ansStr[i] = ' '; } else//如果为空 ansStr[i] = '?'; break; default: cerr << "错误的括号" << endl; } } while (!s.empty()) { //解决多余的左括号 ansStr[s.top()] = '$'; s.pop(); } cout << ansStr << endl; } /************************************************************** Problem: 1153 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1524 kb ****************************************************************/
“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。
首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。
每个案例第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)
每个案例包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)
4 5 2 3 2 1
1 BeiJu 1 BeiJu
#include <iostream> #include <cstring> using namespace std; int findK(int key,int A[],int s,int n){ int count = 1; for (int i = s + 1; i < n; i++){ if (A[i]==key){ count++; } } return count; } int pCount[200]; int f[1000]; int main(){ int N, M; int key; while (cin >> N >> M){ memset(pCount, 0, 200 * sizeof(int)); for (int i = 0; i < N; i++){ cin >> key; pCount[key]++; f[i] = key; } for (int i = 0; i < N; i++){ key = f[i]; if (pCount[key] == 1) cout << "BeiJu" << endl; else cout << pCount[key]-1<< endl; } } return 0; } /************************************************************** Problem: 1156 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1524 kb ****************************************************************/
第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES。
输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000)。
如果偶数比奇数多,输出NO,否则输出YES。
5 1 5 2 4 3
YES
#include "vector" #include <iostream> using namespace std; int main() { int n = 0; while (cin >> n) { vector<int> vec(n); int count = 0; for (int i = 0; i < n; i++) { cin >> vec[i]; if (vec[i] % 2 == 1) count++; } if (count < (n - count)) cout << "NO" << endl; else cout << "YES" << endl; } return 0; } /************************************************************** Problem: 1169 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x y。输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下y最小的。
输入有多组数据。
每组输入n,然后输入n个整数对。
输出最小的整数对。
5 3 3 2 2 5 5 2 1 3 6
2 1
#include <iostream> #include "algorithm" using namespace std; typedef struct _Point { int x; int y; }Point; bool cmpPoint(Point a, Point b) { if (a.x != b.x) return a.x < b.x; else return a.y<b.y; } int main(void) { int n = 0; while (cin>>n) { Point w[1000]; for (size_t i = 0; i < n; i++) cin >> w[i].x >> w[i].y; //多关键字排序 sort(w, w + n, cmpPoint);//功能是先排x,若相等则在其基础上对y进行排序。 //输出最小点 cout << w[0].x << " " << w[0].y << endl; } return 0; } /************************************************************** Problem: 1170 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
输入一个N维矩阵,判断是否对称。
输入第一行包括一个数:N(1<=N<=100),表示矩阵的维数。
接下来的N行,每行包括N个数,表示N*N矩阵的元素。
可能有多组测试数据,对于每组数据,
输出"Yes!”表示矩阵为对称矩阵。
输出"No!”表示矩阵不是对称矩阵。
4 16 19 16 6 19 16 14 5 16 14 16 3 6 5 3 16 2 1 2 3 4
Yes! No!
#include <iostream> #include "algorithm" using namespace std; int main() { int n = 0; while (cin>>n) { //vector<vector<int>> array(n);//定义二维数组 //for (int i = 0; i <n; i++) // array[i].resize(n);//注意:必须设置二维数组的列数,即每一行有多少个元素 //array[2][1] = 12;//将第三行的第二个元素初始化为12 int **array=new int*[n]; for (int i = 0; i < n; i++) array[i] = new int[n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> array[i][j];//一行一行获取数据 } } bool flag = false; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (array[i][j] != array[j][i])//对称的位置上必须相等 flag = true; } if (flag) break; } if (flag) cout << "No!" << endl; else cout << "Yes!" << endl; } } /************************************************************** Problem: 1180 User: EbowTang Language: C++ Result: Accepted Time:50 ms Memory:1916 kb ****************************************************************/
编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符。
(凡是以一个或多个空格隔开的部分就为一个单词)
输入包括1行字符串,以“.”结束,字符串中包含多个单词,单词之间以一个或多个空格隔开。
可能有多组测试数据,对于每组数据,
输出字符串中每个单词包含的字母的个数。
hello how are you.
5 3 3 3
#include "stdio.h" #include "vector" #include "string" #include "iostream" using namespace std; int main() { string str; while (getline(cin,str)) { for (size_t i = 0; i < str.length(); i++) { int count = 0; //while (str[i] <= 'z' && str[i] >= 'a' || str[i] <= 'Z' && str[i] >= 'A') while (isalpha(str[i])) {//只要是字母就统计 count++; i++; } if (count)//防止多个空格 { if (i==(str.length()-1)) cout << count; else cout << count<<" "; } } cout << endl; } return 0; } /************************************************************** Problem: 1182 User: EbowTang Language: C++ Result: Accepted Time:20 ms Memory:1520 kb ****************************************************************/
守形数是这样一种整数,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,因此25是一个守形数。
编一个程序,判断N是否为守形数。
输入包括1个整数N,2<=N<100。
可能有多组测试数据,对于每组数据,
输出"Yes!”表示N是守形数。
输出"No!”表示N不是守形数。
25 4
Yes! No!
#include "vector" #include "string" #include <iostream> #include "algorithm" #include<stdio.h> using namespace std; int main() { int n, m, f; while (scanf("%d", &n) != EOF) { if(n<2||n>=100) break; m = n; n = n*n; if (n % 1000 == m) printf("Yes!\n"); else if (n % 100 == m) printf("Yes!\n"); else if (n % 10 == m) printf("Yes!\n"); else printf("No!\n"); } return 0; } /************************************************************** Problem: 1183 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
ABC##DE#G##F###
其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入包括1行字符串,长度不超过100。
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
abc##de#g##f###
c b e g d f a
#include "string" #include "algorithm" #include <iostream> #include "stack" #include <cmath> #include <set> using namespace std; string preStr; // 节点定义 class BSTNode { public: BSTNode()// 默认构造 { pRight = NULL; pLeft = NULL; value = 0; } ~BSTNode(); friend class LinkBST;// 允许链表类随意访问节点数据 private: char value; BSTNode *pRight; BSTNode *pLeft; }; // 无头结点的二叉树定义 class LinkBST { public: LinkBST(){}; ~LinkBST(){}; // 根据字符串重建二叉树 void ReBuildTree(BSTNode *&pNode, int &index); // 中序遍历 void InOrder(BSTNode *&pRoot); }; // 中序遍历 void LinkBST::InOrder(BSTNode *&pNode) { if (pNode != NULL) { InOrder(pNode->pLeft); cout << pNode->value << " "; InOrder(pNode->pRight); } } // 根据前序字符串重建二叉树 void LinkBST::ReBuildTree(BSTNode *&pNode, int &index) { if (index == preStr.size()) return; if (preStr[index] == '#') { pNode = NULL; index++; } else { pNode = new BSTNode; pNode->value = preStr[index]; index++; ReBuildTree(pNode->pLeft, index);//总是先建完左子树,再建右子树 ReBuildTree(pNode->pRight, index); } } /* a / \ b # / \ c d <------本例题的二叉树逻辑结构 / \ / \ # # e f / \ / \ # g # # / \ # # */ int main() { while (cin >> preStr) { BSTNode *pRoot = NULL; LinkBST bst; int index = 0; bst.ReBuildTree(pRoot,index); bst.InOrder(pRoot); cout << endl; } }
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。
4 1 3 4 2
4 1 2 3
如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。
#include "vector" #include "string" #include "algorithm" #include <iostream> #include "stack" using namespace std; int main() { int n = 0; while (cin >> n) { vector<int> vec(n); if (n >= 2) { for (int i = 0; i < n; i++) cin >> vec[i]; sort(vec.begin(), vec.end()); cout << vec[n - 1] << endl; for (int i = 0; i < n - 2; i++) cout << vec[i] << " "; cout << vec[n - 2] << endl; } else { int val = 0; cin >> val; cout << val << endl << -1 << endl; } } } /************************************************************** Problem: 1185 User: EbowTang Language: C++ Result: Accepted Time:50 ms Memory:1520 kb ****************************************************************/
职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。
输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。
可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。
关键字顺序:年龄>工号>姓名,从小到大。
5 501 Jack 6 102 Nathon 100 599 Lily 79 923 Lucy 15 814 Mickle 65
501 Jack 6 923 Lucy 15 814 Mickle 65
#include "string" #include "algorithm" #include <iostream> using namespace std; typedef struct _Worker { int num; string name; int age; }Worker; bool cmpWorker(Worker x, Worker y) { if (x.age != y.age) { return x.age < y.age; } else { if (x.num != y.num) return x.num<y.num; else return x.age<y.age; } } int main(void) { int n = 0; while (cin>>n) { Worker w[600]; //Worker *w=new Worker[n]; for (size_t i = 0; i < n; i++) cin >> w[i].num >> w[i].name >> w[i].age; //多关键字排序 sort(w, w + n, cmpWorker);//功能是先排年龄,若相等则在其基础上对工号和姓名进行排序。 //输出信息 int min = (n>3) ? 3 : n; for (int i = 0; i < min; i++) cout << w[i].num << " " << w[i].name << " " << w[i].age << endl; } return 0; } /************************************************************** Problem: 1187 User: EbowTang Language: C++ Result: Accepted Time:20 ms Memory:1528 kb ****************************************************************/
生成一个长度为21的数组,依次存入1到21;
建立一个长度为21的单向链表,将上述数组中的数字依次存入链表每个结点中;
将上述链表变为单向封闭(循环)链表;从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;
重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字。
没有任何输入数据。
输出上面题目描述中最后剩下的节点中存入的数字。
请不要直接输出数据水过去,这样达不到提升自己的目的,
请按照题目要求来做题,这样到真正考试时才能应对自如。
#include "iostream" using namespace std; //节点定义 class LinkNode { public: LinkNode(int item)//有参数的构造 {//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面 next = NULL; data = item; } friend class LinkList;//允许链表类随意访问节点数据 private: int data; LinkNode *next; }; // 带头结点的单链表定义 class LinkList { public: //有参数的构造函数 LinkList(int size) { head = new LinkNode(0);//头结点,并未该节点赋值0 nLength = 0; } ~LinkList(){} //定位指定的位置,返回该位置上的结点指针 LinkNode* Locate(int pos); //在指定位置pos插入值为item的结点,失败返回false bool Insert(int item, int pos); //创建一个链表环 void CreatCircle(); //数数出局 bool CountMove(int nStep = 0, int nPersons = 0); private: LinkNode *head;//头结点指针 int nLength;//统计节点长度,不算头结点 }; //返回链表中第pos个元素的地址,第0个元素是头结点 LinkNode* LinkList::Locate(int pos) { LinkNode *p = head; int i = 0; while (p != NULL && i < pos)//p==NULL说明是末尾了 { p = p->next; i++; } return p; } //在pos位置的节点后面插入新节点并赋值item bool LinkList::Insert(int item, int pos) { LinkNode *p = Locate(pos); LinkNode *newNode = new LinkNode(item);//创建新节点,该节点值为item //建立连接 newNode->next = p->next; p->next = newNode; nLength++; return true; } //创建一个链表环 ,将最后一个节点连接第1个节点从而形成环,注意head是第0个节点 void LinkList::CreatCircle() { int nEnd = this->nLength; int nStart = 1; LinkNode *pTail = Locate(nEnd); LinkNode *pcirStart = Locate(nStart); pTail->next = pcirStart; } //从npersons个人中,每数到nstep就出局 bool LinkList::CountMove(int nStep, int nPersons)//指定出局人数 { LinkNode *pCurr = NULL, *pPrev = NULL; int i = 0,n = 0;//n统计已经出局的人数 pCurr = pPrev = head; while (n < nPersons) { pPrev = pCurr;//这三行代码模拟数数 pCurr = pCurr->next; i++; if (i == nStep)// 此时踢出环 ,删除当前节点并且输出该节点的值 { pPrev->next = pCurr->next;//重新建立连接 delete pCurr; pCurr = pPrev->next;//指向新位置的下一个节点 i = 1; n++; } if (pPrev == pCurr)//此时最后一个节点 { cout << pCurr->data << endl; delete pCurr; pCurr = NULL;//最后一个节点删除后的“擦屁股”处理 head->next = head; n++; break; } } return true; } int main() { int nPersons = 21,count = 17; LinkList ysf(nPersons); for (int i = 0; i < nPersons; i++) ysf.Insert(i + 1, i);//在第i个位置插入值为i+1的节点 ysf.CreatCircle(); ysf.CountMove(count, nPersons);//数到count出局 return 0; } /************************************************************** Problem: 1189 User: EbowTang Language: C++ Result: Accepted Time:0 ms Memory:1516 kb ****************************************************************/
给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的。
输入包括一行字符串,其长度不超过1000。
可能有多组测试数据,对于每组数据,如果是回文字符串则输出"Yes!”,否则输出"No!"。
hellolleh helloworld
Yes! No!
#include "string" #include <iostream> #include "algorithm" using namespace std; int main() { string str; while (getline(cin, str)) { bool flag = false; for (int i = 0; i < str.length(); i++) {//回文的重要判断依据就是前后对应位置字符必须一样 if (str[i] != str[str.length() - 1 - i]) { flag = true; break; } } if (flag) cout << "No!" << endl; else cout << "Yes!" << endl; } return 0; } /************************************************************** Problem: 1192 User: EbowTang Language: C++ Result: Accepted Time:40 ms Memory:1520 kb ****************************************************************/
输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。
输入的第一行包括一个整数N,(1<=N<=100),代表矩阵的维数。
接下来的N行每行有N个整数,分别代表矩阵的元素。
可能有多组测试数据,对于每组数据,将输入的矩阵转置后输出。
3 1 2 3 4 5 6 7 8 9
1 4 7 2 5 8 3 6 9
#include <cstdio> #include <cstdlib> #include "vector" #include "string" #include "algorithm" #include <iostream> #include "stack" #include "math.h" #define MAXN 100 using namespace std; int main() { int n, i, j; int array[MAXN][MAXN]; while (scanf("%d", &n) != EOF) { for (i = 0; i < n; i++) {//获取数据 for (j = 0; j < n; j++) scanf("%d", &array[i][j]); } for (i = 0; i < n; i++) {//交换array[i][j]和array[j][i] for (j = i; j < n; j++) { int temp; temp = array[i][j]; array[i][j] = array[j][i]; array[j][i] = temp; } } for (i = 0; i < n; i++) { printf("%d", array[i][0]); for (j = 1; j < n; j++) printf(" %d", array[i][j]); printf("\n"); } } return 0; } /************************************************************** Problem: 1193 User: EbowTang Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/
输入一个整数,将其转换成八进制数输出。
输入包括一个整数N(0<=N<=100000)。
可能有多组测试数据,对于每组数据,
输出N的八进制表示数。
7 8 9
7 10 11
#include "vector" #include <iostream> using namespace std; int main() { int n = 0; while (cin >> n ) { if (n == 0) { cout << 0 << endl; continue; } vector<int> vec(100,0); int nsize = 0; while (n > 0) {//获取8进制数,放入数组 vec[nsize++] = n % 8; n = n / 8; } for (int i = nsize-1; i >= 0; i--) cout << vec[i]; cout << endl; } return 0; } /************************************************************** Problem: 1194 User: EbowTang Language: C++ Result: Accepted Time:200 ms Memory:1520 kb ****************************************************************/
用一维数组存储学号和成绩,然后,按成绩排序输出。
输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。
按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
如果学生的成绩相同,则按照学号的大小进行从小到大排序。
3 1 90 2 87 3 92
2 87 1 90 3 92
#include "vector" #include<algorithm> #include <iostream> using namespace std; typedef struct _StuInfo { int num;//学号 int score;//分数 }StuInfo; bool cmpStu(StuInfo x, StuInfo y) { if (x.score != y.score) return x.score < y.score; else { if (x.num != y.num)//如果分数相同则按照学号排名 return x.num<y.num; } } int main() { StuInfo a[100]; int n; while (cin >> n)//人数 { //获取数据 for (int i = 0; i<n; i++) cin >> a[i].num >> a[i].score; //多关键字排序 sort(a, a + n, cmpStu);//功能是先排分数,若相等则在其基础上对名字和年龄进行排序。 //输出信息 for (int i = 0; i<n; i++) cout << a[i].num << " " << a[i].score << endl; } return 0; } /************************************************************** Problem: 1196 User: EbowTang Language: C++ Result: Accepted Time:470 ms Memory:1520 kb ****************************************************************/
实现一个加法器,使其能够输出a+b的值。
输入包括两个数a和b,其中a和b的位数不超过1000位。
可能有多组测试数据,对于每组数据,
输出a+b的值。
2 6 10000000000000000000 10000000000000000000000000000000
8 10000000000010000000000000000000
#include "vector" #include "string" #include <iostream> #include "algorithm" #define N 1010 int len = 1001; using namespace std; void AddBigNum(const string &a, const string &b, vector<int> &ansStr); int main() { string bigNum1, bigNum2; // 初始状态用string来存储大数 while (cin >> bigNum1 >> bigNum2) { int c = max(bigNum1.size(),bigNum2.size()); vector<int> ans(len, 0);//接收答案 AddBigNum(bigNum1, bigNum2, ans);//执行大整数加法 if (ans[0] != 0) //看看最高位是否有进位 for (int i = 0; i <= c; i++) cout << ans[i]; else for (int i = 1; i <= c; i++) cout << ans[i]; cout << endl; ans.clear(); } return 0; } void AddBigNum(const string &a, const string &b, vector<int> &ans) { int length1=a.size(), length2=b.size(); vector<int> anum(len,0),bnum(len,0); int k = max(a.size(), b.size()); int c = k; //按照字符串中的数据顺序转换成整数 for (int i = 0; i<length1; k--, i++) //低位放在数组的前面,比如523,a[3]=3,a[2]=2,a[1]=5 anum[k] = a[length1 - 1 - i] - '0'; for (int i = 0, k = c; i<length2; k--, i++) //低位放在数组的前面,比如19,b[3]=9,b[2]=1,b[1]=0 bnum[k] = b[length2 - 1 - i] - '0'; //作位相加 for (int i = c; i>0; i--) ans[i] = anum[i] + bnum[i];//ans[3]=12,ans[2]=3,ans[1]=5 //进位,低位向高位进位 for (int i = c; i>0; i--) { if (ans[i] >= 10) {//ans[i-1]是高位,ans[i]是低位 ans[i - 1] += ans[i] / 10; ans[i] = ans[i] % 10; } } } /************************************************************** Problem: 1198 User: EbowTang Language: C++ Result: Accepted Time:150 ms Memory:1520 kb ****************************************************************/