C++函数练习题

我是计算机专业的一位大一本科生,C++小白,下面是我们学校在学习C++时用的基础练习题,我感觉这些题比较适合初学C++的码友,所以利用空闲时间将这些题整理出来,一是为了让初学C++的码友有所参考,二也是为了复习一下所学过知识。(因准备急促,如有代码错误,还请各位码友指正。)

1.素数

输入一组整数,其中第一个整数为个数n,后续为n个整数,输出其中素数的个数。要求将判断一个整数是否为素数用函数实现。
Sample Input
3 5 7 9
Sample Output
2

#include<iostream>
using namespace std;
bool f(int n)
{
    
    
	int i;
	for (i = 2; i < n; i++)
	{
    
    
		if (n % i == 0)
			break;
	}
	if (i == n)
		return true;
	else
		return false;
}
int main()
{
    
    
	int n, i, s = 0, k;
	cin >> n;
	for (i = 0; i < n; i++)
	{
    
    
		cin >> k;
		if (f(k))
			s++;
	}
	cout << s << endl;
	return 0;
}

2.因数个数之和

输入一组整数,计算这些整数的因数个数之和。其中第一个整数为个数n,后续为n个整数。要求计算一个整数的因数个数用函数实现。
Sample Input
3 6 8 5
Sample Output
10

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	int i, s = 0;
	for (i = 1; i <= n; i++)
	{
    
    
		if (n % i == 0)
			s++;
	}
	return s;
}
int main()
{
    
    
	int n, i, s = 0, k;
	cin >> n;
	for (i = 0; i < n; i++)
	{
    
    
		cin >> k;
		s += f(k);
	}
	cout << s << endl;
	return 0;
}

3.Fibonacci数列

输入2 个正整数mini和maxi(0<=mini,maxi<=1000),输出斐波那契数列(Fibonacci sequence)的值介于mini 和maxi之间(不含边界)所有的数。要求定义并调用函数fib(n),它的功能是返回该数列的第n项(n>=0)。
(说明:Fibonacci 序列为0 1 1 2 3 5 8 13 21 …)
Sample Input
5 21
Sample Output
8 13

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	if (n == 0)
		return 0;
	else if (n == 1 || n == 2)
		return 1;
	else
		return f(n - 1) + f(n - 2);
}
int main()
{
    
    
	int mini, max, i;
	cin >> mini >> max;
	for (i = 0; i <= max; i++)
	{
    
    
		if (f(i) >= max)
			break;
		else if (f(i) > mini)
			cout << f(i) << " ";
	}
	return 0;
}

4.最大值

从键盘输入n对整数,求这些对整数间所有奇数之和的最大值。其中第一个整数为n,后续为n对整数。 要求计算一对整数min、max(含min和max)之间所有奇数的和用函数实现,若min>max,函数返回值为0。
Sample Input
3 10 20 17 31 40 45
Sample Output
192

#include<iostream>
using namespace std;
int f(int min, int max)
{
    
    
	int i = 0;
	int s = 0;
	if (max < min)
		return 0;
	else
	{
    
    
		for (i = min; i <= max; i++)
		{
    
    
			if (i % 2 == 1)
				s += i;
		}
		return s;
	}
}
int main()
{
    
    
	int i, j, m, n, max = 0;
	cin >> j;
	for (i = 0; i < j; i++)
	{
    
    
		cin >> m >> n;
		if (f(m, n) > max)
			max = f(m, n);
	}
	cout << max << endl;
	return 0;
}

5.阶乘

编写一个递归函数fac,该函数计算n的阶乘,0的阶乘为1。 main函数中输入n个整数,计算这些整数的阶乘平均值。
Sample Input
3 3 4 5
Sample Output
50

#include<iostream>
using namespace std;
int fac(int n)
{
    
    
	if (n == 0 || n == 1)
		return 1;
	return n * fac(n - 1);
}
int main()
{
    
    
	int n, k, i;
	double s = 0;
	cin >> n;
	for (i = 0; i < n; i++)
	{
    
    
		cin >> k;
		s += fac(k);
	}
	cout << s / n << endl;
	return 0;
}

6.小牛问题

若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛。(用递归函数方法求解)
Sample Input
7
Sample Output
6

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	if (n < 4)
		return 1;
	return f(n - 1) + f(n - 3);//若年数大于等于4,则今年的数量等于去年的加上三年前的(因为第四年生1头)
}
int main()
{
    
    
	int n;
	cin >> n;
	cout << f(n) << endl;
	return 0;
}

7.最大公约数

输入n对整数,计算这n对整数最大公约数之和。其中第一个为对数n,后续为n对整数。要求计算一对整数的最大公约数用函数实现。
Sample Input
3 14 18 20 30 25 35
Sample Output
17

#include<iostream>
using namespace std;
int f(int a, int b)
{
    
    
	int i;
	int min = a;
	if (b < min)
		min = b;
	for (i = min; i >= 0; i--)
	{
    
    
		if (a % i == 0 && b % i == 0)
			break;
	}
	return i;
}
int main()
{
    
    
	int a, b, n, s = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> a >> b;
		s += f(a, b);
	}
	cout << s << endl;
	return 0;
}

8.幂函数

设计一个递归函数,求x的n次幂,其中n为非负整数。 在main函数中输入x和一个整数n,输出x的n次幂。
Sample Input
3.5 4
Sample Output
150.063

#include<iostream>
using namespace std;
double f(double x, int n)
{
    
    
	if (n == 0)
		return 1;
	return x * f(x, n - 1);
}
int main()
{
    
    
	double x;
	int n;
	cin >> x >> n;
	cout << f(x, n) << endl;
	return 0;
}

9.幂函数

定义运算n^k 表示n的k次幂,从键盘输入整数n和k,计算1^k +2^k +……+n^ k,其中求n^k用函数实现。
Sample Input
3 5
Sample Output
276

#include<iostream>
using namespace std;
int f(int n, int k)
{
    
    
	if (k == 0)
		return 1;
	return n * f(n, k - 1);
}
int main()
{
    
    
	int n, k;
	cin >> n >> k;
	int s = 0;
	for (int i = 1; i <= n; i++)
	{
    
    
		s += f(i, k);
	}
	cout << s << endl;
	return 0;
}

10.素数求和

输入两个正整数min、max,计算[min,max]之间所有的素数之和。将判断一个整数是否为素数用函数实现。
Sample Input
2 10
Sample Output
17

#include<iostream>
using namespace std;
bool f(int n)
{
    
    
	int i;
	for (i = 2; i < n; i++)
	{
    
    
		if (n % i == 0)
			break;
	}
	if (i == n)
		return true;
	else
		return false;
}
int main()
{
    
    
	int min, max, s = 0;
	cin >> min >> max;
	for (int i = min; i <= max; i++)
	{
    
    
		if (f(i))
		{
    
    
			s += i;
		}
	}
	cout << s << endl;
	return 0;
}

11.最小公倍数之和

输入n对整数,计算这n对整数最小公倍数之和。其中第一个为对数n,后续为n对整数。计算一对整数的最小公倍数用函数实现。
Sample Input
2 3 5 4 8
Sample Output
23

#include<iostream>
using namespace std;
int f(int a, int b)
{
    
    
	int i;
	for (i = a; i <= a * b; i++)
		if (i % a == 0 && i % b == 0)
			break;
	return i;
}
int main()
{
    
    
	int a, b, n, s = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> a >> b;
		s += f(a, b);
	}
	cout << s << endl;
	return 0;
}

12.逆序求和

从键盘输入一组整数(以0结束),计算这组整数逆序后之和。其中将一个整数逆序用函数实现,整数123逆序为321、整数-345逆序为-543。
Sample Input
234 894 -94 736 0
Sample Output
1518

#include<iostream>
using namespace std;
int f(int a)
{
    
    
	int t = 1;
	if (a < 0)
	{
    
    
		a = -a;
		t = -1;
	}
	int s = 0;
	while (a)
	{
    
    
		s = s * 10 + a % 10;
		a = a / 10;
	}
	return s * t;
}
int main()
{
    
    
	int n, s = 0;
	cin >> n;
	while (n)
	{
    
    
		s += f(n);
		cin >> n;
	}
	cout << s << endl;
	return 0;
}

13.数位计算

输入一组正整数(以0结束),输出其中数位之和为奇数的整数。其中求一个数的数位之和用函数实现。
Sample Input
12 22 45 88 0
Sample Output
12 45

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	int s = 0;
	while (n)
	{
    
    
		s += n % 10;
		n = n / 10;
	}
	return s;
}
int main()
{
    
    
	int n;
	cin >> n;
	while (n)
	{
    
    
		if (f(n) % 2 == 1)
			cout << n << " ";
		cin >> n;
	}
	return 0;
}

14.数值计算

输入2个正整数a和n,求a+aa+aaa+aa…a(n个a)之和。例如,输入2和3,则计算2+22+222,输出246。将求i个a组成的数用函数实现,即函数int f(int a,int i)的返回值为i个a的值,例如f(3,2)值为33。
Sample Input
2 3
Sample Output
246

#include<iostream>
using namespace std;
int f(int a, int i)
{
    
    
	int s = 0;
	for (int j = 0; j < i; j++)
	{
    
    
		s = s * 10 + a;
	}
	return s;
}
int main()
{
    
    
	int a, i, n, j;
	cin >> a >> n;
	int s = 0;
	for (i = 1; i <= n; i++)
	{
    
    
		s += f(a, i);
	}
	cout << s << endl;
	return 0;
}

15.累加和

编写一个函数f(n)=1+2+…+n。 main函数从键盘输入m、n,利用该函数计算并输出f(m)+f(n)。
Sample Input
10 5
Sample Output
70

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	if (n == 1)
		return 1;
	return n + f(n - 1);
}
int main()
{
    
    
	int m, n;
	cin >> m >> n;
	cout << f(m) + f(n) << endl;
	return 0;
}

16.利用函数计算平均值

编写一个函数f(x),若x>0函数返回值为1,若x<0函数返回值为-1,若x=0函数返回值为0,利用该函数实现计算输入的n个整数中正整数的平均值。输入格式中第一个为整数个数n,后续为n个整数。
Sample Input
5 2 5 -5 3 -3
Sample Output
3.33333

#include<iostream>
using namespace std;
int f(int x)
{
    
    
	if (x > 0)
		return 1;
	else if (x < 0)
		return -1;
	else
		return 0;
}
int main()
{
    
    
	int n, x, count = 0;
	double s = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> x;
		if (f(x) == 1)
		{
    
    
			s += x;
			count++;
		}
	}
	cout << s / count << endl;
	return 0;
}

17.数根问题递归求解

输入n个正整数(输入格式中第一个为整数个数n,后续为n个整数),输出各个数的数根。要求计算一个数的数根部分利用递归函数实现。 (数根的定义:对于一个正整数n,我们将它的各个位相加得到一个新的数字,如果这个数字是一位数,我们称之为n的数根,否则重复处理直到它成为一个一位数,这个一位数也算是n的数根。)
Sample Input
5 23 424 98 632 12345
Sample Output
5 1 8 2 6

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	int t = n;
	int s = 0;
	if (t < 10)
		return t;
	else
	{
    
    
		while (t)
		{
    
    
			s += t % 10;
			t = t / 10;
		}
		return f(s);
	}
}
int main()
{
    
    
	int n, x, i;
	cin >> n;
	for (i = 0; i < n; i++)
	{
    
    
		cin >> x;
		cout << f(x) << " ";
	}
	return 0;
}

18.奇数判断

输入若干个正整数(输入时以0结束),输出其中所有的奇数及奇数个数。要求判断一个数num的奇偶写成函数bool isodd(num),奇数返回true,否则返回false。
Sample Input
23 4 235 3 52 30 19 11 0
Sample Output
23 235 3 19 11 5

#include<iostream>
using namespace std;
bool isodd(int n)
{
    
    
	if (n % 2 == 1)
		return true;
	else
		return false;
}
int main()
{
    
    
	int j = 0, n;
	cin >> n;
	while (n)
	{
    
    
		if (isodd(n))
		{
    
    
			cout << n << " ";
			j++;
		}
		cin >> n;
	}
	cout << j << endl;
	return 0;
}

19.利用一个自定义函数解决完数和素数问题

编写一个函数求一个数的所有因子之和。 主函数中输入两个整数m、n,利用该函数依次实现下列问题:1)找出n以内所有完数; 2)找出m~n间所有素数 (提示:完数定义为除自身外的所有因子之和等于它本身的数;素数定义为除了能被1和自身整数外,不能被其它数整数。注意:完数和素数分2行显示。)
Sample Input
50 100
Sample Output
6 28
53 59 61 67 71 73 79 83 89 97

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	int i, s = 0;
	for (i = 1; i <= n; i++)
	{
    
    
		if (n % i == 0)
			s += i;
	}
	return s;
}
int main()
{
    
    
	int m, n, i;
	cin >> m >> n;
	for (i = 1; i <= n; i++)
	{
    
    
		if (f(i) - i == i)
			cout << i << " ";
	}
	cout << endl;
	for (i = m; i <= n; i++)
	{
    
    
		if (f(i) == 1 + i)
			cout << i << " ";
	}
	return 0;
}

20.fibonacci数列倒数求和

算1+1+1/2+1/3+1/5+1/8+…,当最后一项小于e(用户输入)时结束。提示各项的分母为fibonacci数列:0,1,1,2,3,5,8,。。。,其中第0项为0。要求:求fibonacci数列第n项写成递归函数。
Sample Input
0.01
Sample Output
3.3417

#include<iostream>
using namespace std;
int f(int n)
{
    
    
	if (n == 0)
		return 0;
	if (n == 1 || n == 2)
		return 1;
	return f(n - 1) + f(n - 2);
}
int main()
{
    
    
	double s = 0;
	int i = 1;
	double e;
	cin >> e;
	while ((1.0 / f(i)) >= e)
	{
    
    
		s += (1.0 / f(i));
		i++;
	}
	cout << s << endl;
	return 0;
}

以上20道题均为函数基础练习题,涉及普通函数,递归函数等内容。比较适合初学C++函数部分的码友,进行练习。

猜你喜欢

转载自blog.csdn.net/Archie20/article/details/112470412