最近在做练习题,发现数据结构编程方面的习题由c++实现的书很少。殷老师的这本书针对考研和大厂面试,很有价值,所以想把这本习题答案由C实现转为C++实现。书很厚,算法题有700多道,希望自己能坚持下来吧。
说明:
*为了保护版权我不展示题目,推荐购买正版书。
*所有程序均在vs-64-17.3.6上测试通过。
*限于本人水平,不保证答案是最佳实现,我会尽量保证输出的正确性,但程序没有经过严格测试,仅做了最初步的测试,出现错误请大家纠正,不胜感激。欢迎技术讨论,结交朋友,共同进步。
*转载请注明作者MarkBeY即可。
1.1.1
#include<iostream>
using namespace std;
string hello(string name) {
return "Hello,"+name +'.' ;
}
int main() {
cout << hello("world") << endl;
}//本例意在强调头文件、函数过程与主函数,这三者是一个程序的组成三要素。
1.1.2
#include<iostream>
#include<cmath>
using namespace std;
int main() {
float a, b, c, d;
cout << "请输入方程的系数a,b,c" << endl;
cin >> a >> b >> c;
cout << a <<' ' << b << ' ' << c << endl;
d = sqrt(b * b - 4 * a * c);
if (abs(d) < 0.01)cout << "方程的唯一根是:" << (-b) / (2 * a) << endl;//注意d==0的比较方式
else if (d > 0)cout << "方程的两个根是:" << (-b + d) / (2 * a) << ' ' << (-b - d) / (2 * a) << endl;
else cout << "方程无解!" << endl;
}//简单的数学计算,注意使用float时不要与0直接比大小,如果用int还需要转换类型。
1.1.3
#include<iostream>
using namespace std;
int main() {
int a, b, c, m1, m2;//目的是最终在m2里存放中值,打印m2即可
cin >> a >> b >> c;
cout << a << ' ' << b << ' ' << c << endl;
if (a < b) { m1 = a; m2 = b; }
else { m1 = b; m2 = a; }
if (c < m1)m2 = m1;
else if (c < m2)m2 = c;
cout << m2 << endl;
}//复习if-else的用法
1.1.4
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> a{ 3,9,4,6,1,8,2,7,5,0 };
sort(a.begin(),a.end());
for (auto& e : a)
cout << e << ' ';
cout << endl;
}//排序是STL库的特长,常用的有快速排序、归并排序、堆排序,还有基于红黑树的set也可以。基于范围的for循环是C++11的新特性。原题使用了类似于桶排序的原理也是要掌握的。
1.1.5
//目前不敢肯定书上答案就是错的。
//发现答案有误,书上的代码输入4会跑出2,输入3会跑出1来。本题返回不大于n的素数,参考答案的代码没有考虑m=1时k=1的情况,在n=4时会输出2(正确解应该是3,3是最接近4的素数。)这是因为1能被包括素数在内的所有数整除所以k=1不能作为判断素数的除数,因此应该加入k>1的条件,以及一旦k=1则i即为所求并输出。
修改后的C代码如下:
#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996) //现在的vs跑老的C代码经常报错,此法即可解决。
void main() {
int n, d, i, k, m, found;
scanf("%d", &n);
i = n; d = (int)sqrt(n); found = 0;
while (i > d && found == 0) {
m = (int)sqrt(i);
for( k = i-1 ; k >= m && k > 1 ; k-- ) //此行修正
if (i % k == 0) { i--; break; }
if (k < m || (k==1) ) found = 1; //此行修正
}
printf("不大于%d的最大素数是%d\n", n, i);
}
C++代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int n,k,m;
bool found = false;
cin >> n;
int i = n;
int d =sqrt(n);
for (; i > d; i--) {
m = (int)sqrt(i);
for (k = i - 1; k >= m && k > 1; k--) {
if (i % k == 0)break; //两句if必居其一,所以i--可以写在for()中
}
if (k < m || (k == 1))break;
}
cout <<"不大于n的最大素数是" << i << endl;
}