前些年份的程序设计与最近三年程序设计风格差异很大且题目描述不规范(真题是按照你们刷的acwing语法基础课上面的形式给出,即有标准的输入输出格式、数据范围和样例,如图所示)。因此本节(14年)程序设计不作为重点,主要给大家讲解一下程序设计的思路。
14年数据结构和程序设计难度都是非常低的,几乎全是送分题,且这些都是回忆版,可能与真题相差较大。于是我按照真题的风格对回忆版题目进行了修正,格式更标准,部分题目新增【进阶】板块。
一、进制转换
将十进制数转换为2进制数。
输入格式
第一行包含整数 $N$,表示数据个数。
接下来 $N$行,每行包含一个整数 $X$。
输出格式
输出共 $N$行,每行输出一个$X$代表的二进制数。
数据范围
$1≤N≤100$
$1≤X≤1000$
输入样例
3
1
17
30
输出样例
1
10001
11110
代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n --)
{
int x;
cin >> x;
string res = "";
while (x)
{
res = to_string(x & 1) + res;
x >>= 1;
}
cout << res << endl;
}
return 0;
}
【进阶】将十进制数转换为8进制数。
输入格式
第一行包含整数 $N$,表示数据个数。
接下来 $N$行,每行包含一个整数 $X$。
输出格式
输出共 $N$行,每行输出一个$X$代表的8进制数。
数据范围
$1≤N≤100$
$1≤X≤1000$
输入样例
3
1
17
30
输出样例
1
21
36
代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n --)
{
int x;
cin >> x;
string res = "";
while (x)
{
res = to_string(x % 8) + res;
x /= 8;
}
cout << res << endl;
}
return 0;
}
【进阶】将十进制数转换为16进制数。
输入格式
第一行包含整数 $N$,表示数据个数。
接下来 $N$行,每行包含一个整数 $X$。
输出格式
输出共 $N$行,每行输出一个$X$代表的16进制数。
数据范围
$1≤N≤100$
$1≤X≤1000$
输入样例
3
1
17
30
输出样例
1
11
1E
代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n --)
{
int x;
cin >> x;
string res = "";
while (x)
{
int t = x % 16;
if (t < 10) res = to_string(t) + res;
else res = "ABCDEF"[t - 10] + res;
x /= 16;
}
cout << res << endl;
}
return 0;
}
二、回文串
判断一个字符串是否是回文串。
输入格式
输入一个字符串$S$。
输出格式
直接输出true
orfalse
。
数据范围
字符串长度不超过$1000$。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
bool is_palindrome(string s)
{
for (int i = 0, j = s.size() - 1; i < j; i ++, j --)
if (s[i] != s[j]) return false;
return true;
}
int main()
{
string s;
cin >> s;
if (is_palindrome(s)) puts("true");
else puts("false");
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 递归版本
bool is_palindrome(string s, int i, int j)
{
if (i >= j) return true;
return s[i] == s[j] && is_palindrome(s, i + 1, j - 1);
}
int main()
{
string s;
cin >> s;
if (is_palindrome(s)) puts("true");
else puts("false");
return 0;
}
三、图书管理系统
某出版社需要统计目前最畅销的30本书的售书情况。设:每一本书需保存的信息有:书名,库存量,单价,出书统计数;从键盘每次输入一本书的书名(假设购买该出版社的读者有100人);程序根据输入的书名,使该书的库存量减少一本,售书统计数增加1;按售书统计数的多少从大到小排序输出书名,售书统计数,库存量。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3; // 统计30本书的销售情况,这里为了方便输入定义为3
const int M = 5; // 购买该出版社的读者有100人,这里为了方便输入定义为5
struct Book
{
string name{"book_name"}; // 书名
int num{100}; // 库存
double price{50}; // 价格
int sale{0}; // 销量
bool operator< (const Book& t) const
{
return sale > t.sale;
}
}book[N];
void quick_sort(int l, int r)
{
if (l >= r) return ;
int i = l - 1, j = r + 1, x = book[l + r >> 1].sale;
while (i < j)
{
do i ++; while (book[i].sale > x);
do j --; while (book[j].sale < x);
if (i < j) swap(book[i], book[j]);
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int main()
{
puts("请输入书籍信息:");
for (int i = 0; i < N; i ++)
{
printf("请依次输入第%d本书的书名,库存量,单价:\n", i + 1);
cin >> book[i].name >> book[i].num >> book[i].price;
}
puts("请依次输入要销售的书的书名:");
for (int i = 0; i < M; i ++)
{
printf("第%d本书的书名:", i + 1);
string s;
cin >> s;
for (Book &b : book)
{
if (s == b.name)
{
b.sale ++;
b.num --;
puts("出库成功!");
break;
}
}
}
// sort(book, book + N);
quick_sort(0, N - 1);
for (int i = 0; i < N; i ++)
printf("书名:%s 库存:%d 单价:%lf 销量:%d\n", book[i].name.c_str(), book[i].num, book[i].price, book[i].sale);
// 为了与C兼容,在C中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式。
return 0;
}
/**
* 输入示例:
* 高数18讲 20 38.8
* 张宇1000题 30 28.8
* 基础30讲 40 88.8
*/
/**
* 输出:
请输入书籍信息:
请依次输入第1本书的书名,库存量,单价:
高数18讲 20 38.8
请依次输入第2本书的书名,库存量,单价:
张宇1000题 30 28.8
请依次输入第3本书的书名,库存量,单价:
基础30讲 40 88.8
请依次输入要销售的书的书名:
第1本书的书名:高数18讲
出库成功!
第2本书的书名:高数18讲
出库成功!
第3本书的书名:高数18讲
出库成功!
第4本书的书名:张宇1000题
出库成功!
第5本书的书名:基础30讲
出库成功!
书名:高数18讲 库存:17 单价:38.800000 销量:3
书名:张宇1000题 库存:29 单价:28.800000 销量:1
书名:基础30讲 库存:39 单价:88.800000 销量:1
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 3; // 统计30本书的销售情况,这里为了方便输入定义为3
const int M = 5; // 购买该出版社的读者有100人,这里为了方便输入定义为5
struct Book
{
char name[20]; // 书名
int num; // 库存
double price; // 价格
int sale; // 销量
bool operator< (const Book& t) const
{
return sale > t.sale;
}
} book[N];
void quick_sort(int l, int r)
{
if (l >= r) return ;
int i = l - 1, j = r + 1, x = book[l + r >> 1].sale;
while (i < j)
{
do i ++; while (book[i].sale > x);
do j --; while (book[j].sale < x);
if (i < j) swap(book[i], book[j]);
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int main()
{
puts("请输入书籍信息:");
for (int i = 0; i < N; i ++)
{
printf("请依次输入第%d本书的书名,库存量,单价:\n", i + 1);
scanf("%s%d%lf", book[i].name, &book[i].num, &book[i].price);
}
puts("请依次输入要销售的书的书名:");
for (int i = 0; i < M; i ++)
{
printf("第%d本书的书名:", i + 1);
char s[20];
scanf("%s", s);
for (Book &b : book)
{
if (!strcmp(s, b.name)) // s == b.name
{
b.sale ++;
b.num --;
puts("出库成功!");
break;
}
}
}
// sort(book, book + N);
quick_sort(0, N - 1);
for (auto & i : book)
printf("书名:%s 库存:%d 单价:%.2lf 销量:%d\n", i.name, i.num, i.price, i.sale);
return 0;
}
/**
* 输入示例:
* 高数18讲 20 38.8
* 张宇1000题 30 28.8
* 基础30讲 40 88.8
*/
/**
* 输出:
请输入书籍信息:
请依次输入第1本书的书名,库存量,单价:
高数18讲 20 38.8
请依次输入第2本书的书名,库存量,单价:
张宇1000题 30 28.8
请依次输入第3本书的书名,库存量,单价:
基础30讲 40 88.8
请依次输入要销售的书的书名:
第1本书的书名:高数18讲
出库成功!
第2本书的书名:高数18讲
出库成功!
第3本书的书名:高数18讲
出库成功!
第4本书的书名:张宇1000题
出库成功!
第5本书的书名:基础30讲
出库成功!
书名:高数18讲 库存:17 单价:38.80 销量:3
书名:张宇1000题 库存:29 单价:28.80 销量:1
书名:基础30讲 库存:39 单价:88.80 销量:1
*/