[大学计算] 自测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] << ",";
    }
}
posted @ 2024-05-15 19:23  RuntimeError-J  阅读(136)  评论(0)    收藏  举报