《数据结构精讲与习题详解》C++实现版。章节——1.1

最近在做练习题,发现数据结构编程方面的习题由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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值