[大学计算] 自测2 答案
身高预测
题目:在不考虑后天因素影响的情况下,成年人的身高可以基于其父母亲的身高,
有下面的身高预测公式:
男性成人时身高 = (父亲身高 + 母亲身高) * 0.54
女性成人时身高 = (父亲身高 * 0.923 + 母亲身高) / 2
请上述公式,完成如下的身高预测函数功能:
heightPredict(double faHeight, double moHeight, char gender)
其中,参数faHeight和moHeight分别表示父亲身高和母亲身高
(单位:米),gender表示性别,’M’代表男性,’F’代表女性,
该函数返回对应的成人时预测身高。
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
double heightPredict(double faHeight, double moHeight, char gender)
{
/**********Program**********/
if(gender == 'M')
{
return (faHeight + moHeight) * 0.54;
}
else
{
return (faHeight * 0.923 + moHeight) / 2;
}
/********** End **********/
}
int grading();
int main()
{
double f, m;
char g;
cin >> f >> m >> g;
cout << fixed << setprecision(2) << heightPredict(f,m,g) << endl;
return 0;
}
数字2
题目:完成函数int num(int l, int r),用于统计某个给
定范围[l, r]的所有整数中,数字2出现的次数。
例如,int num(2, 22)为统计范围[2, 22]中2出现的次数,
数字2在数2中出现了1次,在数12中出现1次,
在数20中出现1次,在数21中出现1次,在数22中出现2次,
所以数字2在该范围内一共出现了6次,函数返回值为6。
#include <iostream>
#include <fstream>
using namespace std;
int num(int l,int r)
{
/**********Program**********/
int cnt = 0;
for (int i = l; i <= r; i ++)
{
int a = i;
while (a)
{
if (a % 10 == 2)
{
cnt ++;
}
a /= 10;
}
}
return cnt;
/********** End **********/
}
int main()
{
int l;
int r;
cin >> l >> r;
cout << num(l,r) << endl;
return 0;
}
盈数
题目:盈数(又称丰数)是一种特殊的自然数,指的是该数的所有真因数(除去其自身)之和这个数要大。然后,盈数的盈度又定义为其真因数之和减去该数的结果。
例如,12的真因数包括1、2、3、4、6,1+2+3+4+6=16>12,所以12是盈数,其盈度为16-12=4。请根据上述定义,完成如下函数功能:
int abundantNumber(int num);
该函数首先判断参数num是否为盈数,如果是则返回其盈度,如果不是,则返回0。
#include <iostream>
#include <fstream>
using namespace std;
int abundantNumber(int num){
/**********Program**********/
int tot = 0;
for (int i = 1; i <= num / 2; i ++)
{
if (num % i == 0)
{
tot += i;
}
}
if (tot <= num)
{
return 0;
}
return tot - num;
/********** End **********/
}
int main()
{
int num;
cin >> num;
cout << abundantNumber(num)<< endl;
return 0;
}
数字之和
题目:完成递归函数digitSum(int n)的编写,该函数用于
计算n的每位数字之和,注意n是一个非负整数。
例如digitSum(1018)应该返回1+0+1+8,即10。
#include <iostream>
#include <fstream>
using namespace std;
int digitSum(int n)
{
/**********Program**********/
if (n == 0)
{
return 0;
}
return digitSum(n / 10) + n % 10;
/********** End **********/
}
int main()
{
int n;
cin >> n;
cout << digitSum(n) << endl;
return 0;
}
稀疏矩阵
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
double sparseness(int m[6][6]) {
/**********Program**********/
int cnt = 0;
for (int i = 0; i < 6; i ++)
{
for (int j = 0; j < 6; j ++)
{
if (m[i][j] == 0)
{
cnt++;
}
}
}
return (double)cnt / (36 - cnt);
/********** End **********/
}
int main(){
int mat[6][6] = {{0}};
for (int pnc = 0; pnc < 6; pnc++){
for (int xtn = 0; xtn <6; xtn++){
cin >> mat[pnc][xtn];
}
}
cout << fixed << setprecision(2) << sparseness(mat) << endl;
return 0;
}
提取数字
题目:函数digit(char str[])抽取字符串str中的数字,用抽取到的
数字组成整数,并返回该整数。字符串str中可能包含
小写英文字母和数字字符0-9,函数digit只抽取其中
的数字字符组成整数。如str为”asd123fgh34sxc1”,
则抽取到的数字组成的整数为123341,请完成该函数的编写。
说明:测试用例保证不会发生整数越界。
#include <iostream>
#include <fstream>
using namespace std;
int digit(char str[]){
/**********Program**********/
int res = 0;
for (int i = 0; str[i] != '\0'; i ++)
{
if (str[i] <= '9' && str[i] >= '0')
{
res = res * 10 + str[i] - '0';
}
}
return res;
/********** End **********/
}
int main()
{
char s[1000];
cin >> s;
cout << digit(s) << endl;
return 0;
}
整数统计
题目:请完成函数cal(int L, int R)功能,该函数统计给定
范围[L, R]的所有整数中回文数的个数(100≤L≤R≤1000000)。
回文数是指将各位数字反向排列所得自然数与原数相同.
例如,[100,130]范围有3个数101、111、121满足要求。
#include <iostream>
#include <fstream>
using namespace std;
int cal(int L, int R)
{
/**********Program**********/
int cnt = 0;
for (int i = L; i <= R; i ++)
{
int len = 0;
int a[256] = {0};
int b = i;
while (b)
{
a[len++] = b % 10;
b /= 10;
}
bool judge = 1;
for (int j = 0; j < len; j ++)
{
if (a[j] != a[len - j - 1])
{
judge = 0;
break;
}
}
if (judge == 1)
{
// cout << i << " ";
cnt++;
}
}
return cnt;
/********** End **********/
}
int main()
{
int L, R;
cin >> L >> R;
cout << cal(L, R) << endl;
return 0;
}
求树根
题目:数根定义:对于一个正整数n,我们将它的各个位相加得到
一个新的数字,如果这个数字是一位数,我们称之为n的数根,
否则重复处理直到它成为一个一位数,最后得到的一位数也
算是n的数根。
计算正整数树根的函数原型是:int numRoot(int n);
函数参数n是一个正整数,返回值是n的数根。请完成该函数定义。
示例1:
输入参数:123456,其各位数字之和是21,21的各位数字之和是3
返回值:3
示例2:
输入参数:35,其各位数字之和是8
返回值:8
提示:建议利用函数递归方法实现。
#include <iostream>
#include <fstream>
using namespace std;
int numRoot(int n)
{
/*********** Program *************/
if (n / 10 == 0)
{
return n;
}
int cnt = 0;
while (n)
{
cnt += n % 10;
n /= 10;
}
return numRoot(cnt);
/************* End ***************/
}
int main()
{
int N;
cin >> N;
cout << numRoot(N) << endl;
return 0;
}
均值滤波
题目:由256种不同浓淡的灰色描绘的图像称为灰度图,其中每个
像素是用整数0~255编码表示这256种灰色,整个灰度图表示为
一个各个像素灰度值构成的整形矩阵。但由于各种干扰因素的
影响,图像像素信息中常含有噪声。
在数字图像处理领域中,均值滤波是一种简单有效的去噪技术,
具体方法是:对目标像素给一个滤波模板,该模板包括了其周围
临近像素(如3×3模板是以目标像素为中心的周围8个像素,
加上自身共9个像素构成一个滤波模板),再用模板中的全体像素
的平均值来代替原来像素值。请以3×3为滤波模板,完成下面函数:
mean_filter(int srcImage[SIZE][SIZE], int dstImage[SIZE][SIZE]),
实现上述的灰度图均值滤波过程,其中参数srcImage为原始灰度图,
均值滤波后结果图像存储在dstImage。
注意:原始图像中四个边缘上的像素值保持不变!
说明:简化起见,题目中所有图像都是4×4的矩阵。
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
#define SIZE 4
void mean_filter(int srcImage[SIZE][SIZE], int dstImage[SIZE][SIZE])
{
/**********Program**********/
int tot = 0;
for (int i = 0; i < 4; i ++)
{
for (int j = 0; j < 4; j ++)
{
dstImage[i][j] = srcImage[i][j];
}
}
for (int i = 0; i < 2; i ++)
{
for (int j = 0; j < 2; j ++)
{
int tot = 0;
for (int a = i; a < i + 3; a ++)
{
for (int b = j; b < j + 3; b ++)
{
tot += srcImage[a][b];
}
}
tot /= 9;
dstImage[i + 1][j + 1] = tot;
}
}
/********** End **********/
}
void print_image(int image[SIZE][SIZE]);
int main()
{
int srcImage[SIZE][SIZE];
int dstImage[SIZE][SIZE];
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
cin >> srcImage[i][j];
}
}
mean_filter(srcImage, dstImage);
print_image(dstImage);
return 0;
}
void print_image(int image[SIZE][SIZE])
{
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
cout << image[i][j] << ",";
}
}

浙公网安备 33010602011771号