我是计算机专业的一位大一本科生,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++函数部分的码友,进行练习。