2016内大892专硕真题编程题保姆级精讲

本文深入探讨C++编程中的常见挑战,包括数值处理、数组操作、递归应用及字符串解析等,通过实例讲解如何巧妙应对,提升编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(免责声明:本人没有正确答案,所有题目均为自己编写,难免会有小错误,希望大家抱着参考的态度去看,没有考虑性能优化,全部都是尽可能为了简单去编写的。所有代码我自己跑过,都运行正确)
在这里插入图片描述
第一题属于送分题,直接上代码:

#include <iostream>

using namespace std;
//只需要写函数部分,main方法里面是测试用的
int MySum(int m, int n) {
    int sum = 0;
    for (int i = m; i <= n; ++i) {
        if (i % 2 == 0) {
            sum += i;//等于sum = sum + i;
        }
    }
    return sum;
}

int main() {
    int m = 3, n = 10;
    int sum = MySum(m,n);
    cout << sum << endl;
}

考察内容:
学生知不知道怎么判断一个数字是否为偶数或者奇数:
用数字对2取余是判断的方法,如果一个数字num%2=1表示这个数字num为奇数,如果num%2=0则表示num为偶数。

比如1%2等于0余1,3%2等于1余1,所以它们是奇数
而2%2等于1余0,4%2等于2余0,所以它们是偶数,很简单,总结一下就是能不能被2整除的意思。偶数可以整除2,而奇数肯定会留下一个1。
在这里插入图片描述
思路:第二题难点在于它的阶乘,如果把阶乘这个方法编写完成,那么这道题也基本就编写完成了。

#include <iostream>

using namespace std;

double getJieCheng(int n) {
    if (n == 0) {
        return 1.0;
    }
    return n * getJieCheng(n - 1);
}

int main() {
    double e = 1;
    int n = 1;
    while ((1.0 / getJieCheng(n)) >1e-6) {//因为阶乘分之一会使整个分数变得越来越小,
    //所以while的循环条件必须是整个分数的值要大于这个数,如果比这个数字小就跳出循环,也就符合题目的要求了。
        e += 1.0 / getJieCheng(n);
        n++;
    }
    e += 1.0 / getJieCheng(n);//必须加这一行,否则就错了,题目要求最后一项的值必须小于10的负六次方
    //而while循环到最后一项比10的负六次方小就不会进入循环了!
    printf("%.10lf",e);
}

设计思路为当阶乘的倒数比10的负六次方大,把阶乘的倒数加在e上,再将n的阶乘加一,再取倒数看看是不是比10的负六次方大,如果比10的负六次方小了,也就满足了题目的要求

需要注意的是while循环最后一项到了比10的负六次方小的时候,就不会进入while循环,自然也就不会把最后一项的数加到e上,这显然是不符合题意的,所以别忘记要加上最后一项阶乘的倒数。用while循环的时候一定要谨慎

(有可能有朋友会疑问,为什么不把n++,因为while循环内最后一次已经把n++了,并且这个n的阶乘的倒数就是比10的负六次方小。)
在这里插入图片描述
杨辉三角属于经典题型了,也相当于白给,简单说一下思路在这里插入图片描述
两边都是1,然后两个同行连续的数字相加就是他下面的数字:
在这里插入图片描述
可以看到第二行有两个并排的1,所以1+1=2,就成了他们俩下面的数字,可以想象为生孩子。。。

在这里插入图片描述
后面的都是以此类推。
所以我们需要一个二维数组,两层for循环就可以解决这个问题:

#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    int arr[20][20];
    for (int i = 0; i < n; ++i) {//第一层for控制总共有几行
        for (int j = 0; j <= i; ++j) {//第二层for控制第几行就有几个元素
            if (j == i) {//把最右边的数都设置为1
                arr[i][j] = 1;
            }else if (j == 0) {//把最左边的数都设置为1
                arr[i][0] = 1;
            } else {//中间的元素就用上一行的第j-1个位置元素+第j个位置的元素
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= i; ++j) {
            cout << arr[i][j];
            cout << " ";
        }cout << endl;
    }
}

在这里插入图片描述
这道题麻烦了一点,但是原理是比较简单的:首先我们需要一个二维数组,m行n列的数组,每行都进行冒泡排序(最简单的就是冒泡,如果需要其他排序算法可以看我之前的排序算法)或者其他的排序方法进行排序就ok了,怎么样?很简单吧,直接上代码:

#include <iostream>

using namespace std;

void sort(float arr[][10], int m, int n) {
    for (int i = 0; i < m; ++i) {
        //第一层for控制二维数组的行数
        //下面两个for是冒泡排序
        for (int k = n - 1; k > 0; --k) {
            //第二层for控制排序的多少次
            for (int j = 0; j < k; ++j) {
                //第三层for目的是把最大的元素排到最后一个位置
                if (arr[i][j] > arr[i][j + 1]) {
                    float tmp = arr[i][j];
                    arr[i][j] = arr[i][j + 1];
                    arr[i][j + 1] = tmp;
                }
            }
        }
    }
}
//验证用,考试不需要写下面的代码
void print(float arr[][10], int m, int n) {
    for (int i = 0; i < m; ++i) {
        //开始二维数组的第一行
        for (int j = 0; j < n; ++j) {
            cout << arr[i][j] << " ";
        }cout << endl;
    }
}
//下面也是验证用的,考试的时候不需要写下面的内容。
int main() {
    float arr[10][10] = {
            {10,9,8,7,6,5,4,3,21,1},
            {10,9,8,7,6,5,4,3,2,1},
            {101,9,8,7,6,5,4,3,22,1},
            {10,9,8,27,6,5,4,3,2,1},
            {10,9,8,7,16,5,4,3,2,1},
            {10,9,8,7,6,5,4,3,2,1},
            {10,9,81,7,6,5,4,3,2,1},
            {10,19,8,7,6,5,14,3,2,1},
            {10,9,8,71,6,15,4,3,2,1},
            {10,9,8,7,6,5,4,3,12,1},
    };
    sort(arr,10,10);
    print(arr, 10, 10);
}

在这里插入图片描述
送分题,比较简单,只需要写出递归就ok,注意递归的出口和递归的内容就做出来了。不懂的百度一下递归的写法

#include <iostream>

using namespace std;

void func(int n) {
    if (n / 10 == 0) {//如果n是个位数,则直接输出,结束递归。
        cout << n << endl;
        return;
    }
    cout << n % 10;//如果n不是个位数,则用n对10取余,算出n的最后一位
    return func(n / 10);//去掉最后一位再循环直到n成为个位数,结束递归。
}
//测试部分,考试不需要写下面的内容
int main() {
    func(4321);
    return 0;
}

在这里插入图片描述
需要知道的是,题目让你输入一串字符,以回车或者其他字符结尾,并且需要对每一个字符进行遍历和操作,那么是有套路/模板的:

...
char ch = getchar();
while(ch!='\n') {
	...
	ch = getchar();
}
...
#include <iostream>

using namespace std;

int main() {
    char ch = getchar();
    bool isNumber = false;//前一个字符是不是一个数字
    int num;//暂存连续的数字
    int sum[100], flag = 0;//sum数组保存所有的数字,flag记录有几个数字
    while (ch != '$') {
        if (ch <= 57 && ch >= 48 && !isNumber) {//常见的ASCII码要记住,0是48,'a'是97,'A'是65
            num = ch - '0';//想把char里的数字取出来,需要用这个方法,大家记住就好了,原理也很简单,就是这个数字的ascii减去0的ascii码,结果就是这个数字
            isNumber = true;
        } else if (ch <= 57 && ch >= 48 && isNumber) {//前一个字符是数字,并且当前字符也是数字
            num *= 10;//num*10加上新的字符,比如前一个字符是9,这个字符是8,就9*10+8=98,
            num += (ch - '0');
        } else if (!(ch <= 57 && ch >= 48) && isNumber) {//前一个字符是数字,当前字符不是数字
            isNumber = false;
            if (num != 0) {
                sum[flag++] = num;//把计算好了的num保存至sum数组
                num = 0;//num重置,为了下次使用
            }
        }
        ch = getchar();//切记要加这句话,别忘了这是模板里必备的一句话,不加while就会死循环
    }
    if (isNumber) {//这是为了解决最后元素是数字,但是最后一个字符是美元符号,就不进入while循环了,就会丢失最后一个数字,还是那句话,使用while循环一定要谨慎!!!!!!!!
        sum[flag++] = num;
    }
    //后面是验证内容,考试时候不需要写
    cout << flag << endl;
    for (int i = 0; i < flag; ++i) {
        cout << sum[i] << " ";
    }
}

关键词:内大892; 内蒙古大学892真题; 2016内蒙古大学892真题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bean冷的心

你的鼓励将是我前进的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值