(免责声明:本人没有正确答案,所有题目均为自己编写,难免会有小错误,希望大家抱着参考的态度去看,没有考虑性能优化,全部都是尽可能为了简单去编写的。所有代码我自己跑过,都运行正确)
第一题属于送分题,直接上代码:
#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真题