c++版本代码的数据结构与算法题(严蔚敏C语言版本绪论)

文章详细介绍了C++实现的排序算法、计算k阶斐波那契数列第m项的方法,以及处理田径比赛成绩统计的程序,包括如何避免整数溢出问题。
摘要由CSDN通过智能技术生成

1.16试写一算法,自大到小依次输出顺序读入的三个整数X,Y,和Z的值。

输入输出样例如下:

输入:520 738 28

输出:738 520 28

#include <iostream> // 引入C++标准输入输出流库
using namespace std; // 使用std命名空间

int main() { // 主函数
    int x, y, z, temp = 0; // 定义三个整数变量x、y、z,以及一个临时变量temp用于交换数值

    cin >> x >> y >> z; // 从标准输入读取三个整数,依次赋值给x、y、z

    // 下面的if-else语句用于将x、y、z中的最大值移动到x位置
    if (x < y) { // 如果x小于y,则交换x和y的值
        temp = y; // 将y的值暂存到temp中
        y = x; // 将x的值赋给y
        x = temp; // 将temp(原y的值)赋给x
    }

    // 判断x和z的大小关系,并进行相应交换,确保x始终为已知的最大值
    if (x < z) {
        temp = z; // 若x小于z,则先将z的值暂存到temp
        z = y; // 将y的值赋给z
        y = x; // 将当前x(原最大值)赋给y
        x = temp; // 将temp(原z的值,即新的最大值)赋给x
    } else { // 如果x不小于z,则只需比较y和z,保证y和z之间的较大值位于y
        if (y < z) { 
            temp = z; // 若y小于z,则将z的值暂存到temp
            z = y; // 将y的值赋给z
            y = temp; // 将temp(原z的值,即y和z之间的较大值)赋给y
        }
    }

    cout << x << " " << y << " " << z; // 输出自大到小排列后的三个整数
}

// 输入样例:520 738 28
// 输出结果:738 520 28

1.17已知k阶斐波那契序列的定义为 

f_0=0,

f_1=0, .

..,

f_{k-2}=0,

f_{k-1}=1

f_n=f_{n-1}+f_{n-2}+...+f_{n-k},

n=k,k+1,...

试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。

// 引入C++标准输入输出流库
#include <iostream>

// 使用std命名空间,简化代码中的输入输出操作
using namespace std;

// 定义计算第m项斐波那契数列(以k为模)的函数FibNum
int FibNum(int m, int k) {
    // 当m小于k-1时,返回0,表示该位置的斐波那契数列值为0
    if (m < k - 1) {
        return 0;
    }
    // 当m等于k-1时,返回1,表示该位置的斐波那契数列值为1
    else if (m == k - 1) {
        return 1;
    } 
    // 当m大于等于k时,采用递归方式计算该位置的斐波那契数列值
    else {
        int c = 0; // 初始化累加器变量c为0
        // 通过循环从1到k计算每一项对结果的贡献
        for (int i = 1; i <= k; i++) {
            // 将FibNum(m-i, k)的结果累加到c中
            c = c + FibNum(m - i, k);
        }
        // 返回累加后的结果c作为第m项斐波那契数列(以k为模)的值
        return c;
    }
}

// 主函数main
int main() {
    // 定义变量m和k,分别用于存储需要计算的斐波那契数列项数和模数
    int m = 0, k;
    
    // 从标准输入读取k和m的值
    cin >> k >> m;
    
    // 调用FibNum函数计算并输出第m项斐波那契数列(以k为模)的值
    cout << FibNum(m, k);
    
    // 注意:本程序未包含结束语句(如return 0;),在C++中main函数可隐式返回0
}

1.19假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,
并构成一张表,表中每一行形式为(项目名称,性别,校名,成绩,得分)
处理上述表格,以统计各院校男,女总分和团体总分,并输出。

(本程序编译通过即可)

本程序采用如下数据:(无需在终端输入,写在程序内即可)

{"100m短跑",male,'a',96,9},

{"100m短跑",male,'b',95,8},

{"100m短跑",male,'c',90,7},

{"100m短跑",male,'d',96,9},

{"100m短跑",male,'e',100,10},

{"800m长跑",female,'a',95,7},

{"800m长跑",female,'b',98,10},

{"800m长跑",female,'c',96,8},

{"800m长跑",female,'d',97,9},

{"800m长跑",female,'e',97,9},

{"800m长跑",female,'f',94,6}

输出:

a大学团体分:16.00 男:9.00 女:7.00
b大学团体分:18.00 男:8.00 女:10.00
c大学团体分:15.00 男:7.00 女:8.00
d大学团体分:18.00 男:9.00 女:9.00
e大学团体分:19.00 男:10.00 女:9.00

// 1.19假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,
// 并构成一张表,表中每一行形式为(项目名称,性别,校名,成绩,得分)
// 处理上述表格,以统计各院校男,女总分和团体总分,并输出。
// (本程序编译通过即可)
// 本程序采用如下数据:(无需在终端输入,写在程序内即可)

// {"100m短跑",male,'a',96,9},

// {"100m短跑",male,'b',95,8},

// {"100m短跑",male,'c',90,7},

// {"100m短跑",male,'d',96,9},

// {"100m短跑",male,'e',100,10},

// {"800m长跑",female,'a',95,7},

// {"800m长跑",female,'a',95,7},

// {"800m长跑",female,'c',96,8},

// {"800m长跑",female,'d',97,9},

// {"800m长跑",female,'e',97,9},

// 输出:
// a大学团体分:16.00 男:9.00 女:7.00
// b大学团体分:18.00 男:8.00 女:10.00
// c大学团体分:15.00 男:7.00 女:8.00
// d大学团体分:18.00 男:9.00 女:9.00
// e大学团体分:19.00 男:10.00 女:9.00
#include <iostream>
#include <string>
#include <iomanip>
#define male 1
#define female 0
using namespace std;
class Student{
    public:
        Student() {}
        int sex;
        double scores;
        double scores1;
        string project;
        char SchoolName;
        Student(string project1,int sex1,char SchoolName1,double score,double score1){
            this->sex=sex1;
            this->project=project1;
            this->SchoolName=SchoolName1;
            this->scores=score;
            this->scores1=score1;
    }
};
int main(){
    double n1,n2,n3,n4,n5,n1_male,n2_male,n3_male,n4_male,n5_male;
    n1=n2=n3=n4=n5=n1_male=n2_male=n3_male=n4_male=n5_male=0.00;
    Student object[10];
        object[0]=Student ("100m短跑",male,'a',96.0,9.0);
        object[1]=Student ("100m短跑",male,'b',95.0,8.0);
        object[2]=Student ("100m短跑",male,'c',90.0,7.0);
        object[3]=Student ("100m短跑",male,'d',96.0,9.0);
        object[4]=Student ("100m短跑",male,'e',100.0,10.0);
        object[5]=Student ("800m长跑",female,'a',95.0,7.0);
        object[6]=Student ("800m长跑",female,'b',98.0,10.0);
        object[7]=Student ("800m长跑",female,'c',96.0,8.0);
        object[8]=Student ("800m长跑",female,'d',97.0,9.0);
        object[9]=Student ("800m长跑",female,'e',97.0,9.0); 
    for(int i=0;i<10;i++){
        if ( object[i].SchoolName =='a'){
            if (object[i].sex==male){
                n1_male+=object[i].scores1;
            }
            n1+=object[i].scores1;
        }
        else if ( object[i].SchoolName =='b'){
            if (object[i].sex==male){
                n2_male+=object[i].scores1;
            }
            n2+=object[i].scores1;
        }else if ( object[i].SchoolName =='c'){
            if (object[i].sex==male){
                n3_male+=object[i].scores1;
            }
            n3+=object[i].scores1;
        }else if ( object[i].SchoolName =='d'){
            if (object[i].sex==male){
                n4_male+=object[i].scores1;
            }
            n4+=object[i].scores1;
        } else{
            if (object[i].sex==male){
                n5_male+=object[i].scores1;
            }
            n5+=object[i].scores1;
        }
    }
    cout << fixed << setprecision(2); // 设置输出精度为2位小数,后续所有浮点数都会遵循此设置
    cout<<"a大学团体分:"<<n1<<" 男:"<<n1_male<<" 女:"<<n1-n1_male<<endl;
    cout<<"b大学团体分:"<<n2<<" 男:"<<n2_male<<" 女:"<<n2-n2_male<<endl;
    cout<<"c大学团体分:"<<n3<<" 男:"<<n3_male<<" 女:"<<n3-n3_male<<endl;
    cout<<"d大学团体分:"<<n4<<" 男:"<<n4_male<<" 女:"<<n4-n4_male<<endl;
    cout<<"e大学团体分:"<<n5<<" 男:"<<n5_male<<" 女:"<<n5-n5_male<<endl;
}

4. (程序题, 25分)

1.18计算i!×2^i的值并存入数组a[0…n-1]的第i个分量中 (i=0,1,2,…,n)。假设计算机中允许的整数最大值为MAXINT,则对某个k(0≤k≤n-1)使k!×2^k>MAXINT时,应按出错处理。注意选择你认为较好的出错处理方法。

输入输出样例如下:

20

a[0]=1 a[1]=2 a[2]=8 a[3]=48 a[4]=384 a[5]=3840 a[6]=46080 a[7]=645120 a[8]=10321920 a[9]=185794560 a[10]=3715891200 a[11]=81749606400 a[12]=1961990553600 a[13]=51011754393600 a[14]=1428329123020800 a[15]=42849873690624000 a[16]=1371195958099968000 a[17]=9727174427979808768 a[18]=18136886080501186560 输出错误,已超过最大值

#include <iostream>
#include <math.h>
using namespace std;
int main(){
    unsigned long long int c=1;
    unsigned long long int b=1;
    unsigned long long int d=1;
    unsigned long long int e=1;
    int ca=0;
    unsigned long long int a[ca]={0};
    cin>>ca;
    if(ca>0||ca==0){
        a[ca]=1;
        cout<<"a[0]="<<1<<" ";

        for(int i=1;i<ca;i++){
            for(int k=1;k<i+1;k++){
                c*=k;
            }
            for(int s=1;s<i+1;s++){
                e*=2;
            }
            b=e*c;
            c=1;
            e=1;
            if (b>d){
                
                d=b; 
                a[ca]=b;
                cout<<"a["<<i<<"]"<<"="<<a[ca]<<" ";
            }
            else{
                cout<<"输出错误,已超过最大值 "<<endl;
                break;
            }
            
        }
    }else{
        return 0;
    }
}

该题主要是要考虑,一旦unsiged long long超过最大限度,将会溢出,以至于在一个递增数列中,存在后一项比前一项小的现象。

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值