1.有 3 个强盗,抢了一个珠宝箱,打开一看,里面很多颗珠宝,分轮次来,老大拿 3 个,老 二拿 2 个,老三拿一个,构成一个轮次,接着开始下一轮,直到拿完宝箱中的珠宝。目前已 知老三拿了 25 颗珠宝,请问 1)宝箱里面原来有多少颗珠宝;2)老大和老二拿了多少颗。 输出所有可能的结果。
#include <iostream>
using namespace std;
/*此代码只能用于解决这一个问题的几种情况,若老三的珠宝数是一个未知数,则需要另外编写程序,使用穷举法解决问题,每个人按照顺序依次增加,打印出相应的结果*/
int main() {
//老三有25颗,那么起码分了25轮
//最少的情况是老大75,老二50,老三25
//数组中第一个存老大,第二个存老二,第三个存老三
int ngems[3] = { 75,50,25 };
//n用于存储情况的数量,total为总数
int n = 0, total = 0;
//每个循环存储一种情况
while (true) {
//先老大逐个增加,最多增加3个
if (ngems[0] != 78) {
for (int i = 0;i <= 3;++i) {
ngems[0] = 75 + i;
total = ngems[0] + ngems[1] + ngems[2];
n += 1;
cout << "第" << n << "种情况为:" << endl;
cout << "宝箱里面原来有" << total << "颗珠宝" << endl;
cout << "老大的数量为" << ngems[0] << "。" << endl;
cout << "老二的数量为" << ngems[1] << "。" << endl;
cout << "老三的数量为" << ngems[2] << "。\n" << endl;
}
}
else {
for (int j = 1;j <= 2;++j) {
ngems[1] = 50 + j;
total = ngems[0] + ngems[1] + ngems[2];
n += 1;
cout << "第" << n << "种情况为:" << endl;
cout << "宝箱里面原来有" << total << "颗珠宝" << endl;
cout << "老大的数量为" << ngems[0] << "。" << endl;
cout << "老二的数量为" << ngems[1] << "。" << endl;
cout << "老三的数量为" << ngems[2] << "。\n" << endl;
}
}
if (ngems[1] == 52) { break; }
}
return 0;
}
2.定义一个学生结构体,成员包括学生姓名、学号、性别、上学期学分绩点;用一个数组去 保存学生信息,共计N个, 问 1:然后进行排序,1)按照学号排序;2)按照绩点排序。排序方法 3 种,交换、选择、 冒泡都要用。 问 2:查找数组中是否有指定学号的学生,如果有,显示出该学生的基本信息,查找方法, 采用顺序查找和折半查找。 问 3:这些学生的平均绩点是多少。哪些人低于平均绩点,要显示出来。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
//使用结构体存储每位学生的信息
struct Student {
string name;
double ID;
string sex;
float GPA;
};
//N为学生数量,i和j用于控制循环
int N = 0, i=0, j=0;
cout << "请输入学生的总数N:" << endl;
cin >> N;
Student* pas = new Student[4];
for (i = 0;i < N;++i) {
cout << "请依次输入一个学生的姓名,学号,性别以及上学期的绩点:"<< endl;
cin >> pas[i].name >> pas[i].ID >> pas[i].sex >> pas[i].GPA;
}
//问1(1)按照学号排序
//交换排序法
Student temp;
for (i = 0;i < N - 1;++i) {
for (j = i + 1 ;j < N;++j) {
if (pas[i].ID > pas[j].ID) {
temp = pas[i];
pas[i] = pas[j];
pas[j] = temp;
}
}
}
cout << "按学号从小到大的排序结果为:" << endl;
for (i = 0;i < N;++i) {
cout<< pas[i].name << " " << pas[i].ID << " "
<< pas[i].sex << " " << pas[i].GPA<<endl;
}
//问1(2)按照绩点排序
//选择排序法
for (i = 0;i < N - 1;++i)
{
int min_GPA = i;
for (j = i + 1;j < N;j++) {
if (pas[j].GPA < pas[min_GPA].GPA) {
min_GPA = j;
}
}
if (i != min_GPA) {
temp = pas[i];
pas[i] = pas[min_GPA];
pas[min_GPA] = temp;
}
}
cout << "按上学期绩点从小到大的排序结果为:" << endl;
for (i = 0;i < N;++i) {
cout << pas[i].name << " " << pas[i].ID << " "
<< pas[i].sex << " " << pas[i].GPA << endl;
}
//问1(2)按照绩点排序
//冒泡排序法
/*for (i = 0;i < N - 1;i++) {
for (j = 0;j < N - i - 1;++j) {
if (pas[j].GPA > pas[j + 1].GPA)
temp = pas[j];
pas[j] = pas[j + 1];
pas[j + 1] = temp;
}
}
cout << "按上学期绩点从小到大的排序结果为:" << endl;
for (i = 0;i < N;++i) {
cout << pas[i].name << " " << pas[i].ID << " "
<< pas[i].sex << " " << pas[i].GPA << endl;
}*/
//问2
double youID;
cout << "请输入学号:" << endl;
cin >> youID;
bool flag = true;
//顺序法
for (i = 0;i < N;++i) {
if (youID == pas[i].ID) {
cout << "这位同学的信息为:" << " ";
cout << pas[i].name << " " << pas[i].ID << " "
<< pas[i].sex << " " << pas[i].GPA << endl;
flag = false;
}
}
if (flag) {
cout << "系统中没有这个学生的信息。" << endl;
}
//二分法查找
/*int begin = 0, end = N, mid;
while (begin <= end) {
mid = (begin + end) / 2;
if (youID == pas[mid].ID) {
cout << pas[mid].name << " " << pas[mid].ID << " "
<< pas[mid].sex << " " << pas[mid].GPA << endl;
flag = false;
break;
}
else if (youID > pas[mid].ID) {
begin = mid;
}
else {
end = mid;
}
}
if (flag) {
cout << "系统中没有这个学生的信息。" << endl;
}*/
//问3
float ave_GPA = 0.0f, sum_GPA = 0.0f;
for (i = 0;i < N;++i) {
sum_GPA += pas[i].GPA;
}
ave_GPA = sum_GPA / N;
cout << "这些学生的平均学分绩点为:" << ave_GPA << endl;
for (i = 0;i < N;++i) {
if (pas[i].GPA < ave_GPA) {
cout << pas[i].name << "的学分绩点低于平均学分绩点." << endl;
}
}
if (pas) {
delete[] pas;
pas = nullptr;
}
return 0;
}