目录
1、等差数列求和
2、判断数字位数
3、有规律的图形
4、简易计算器
5、素数对
6、用函数打印金字塔
7、用函数计算员工的平均工资
8、用函数计算斐波那契数列的指定项
(1)要求用非递归函数实现用函数计算斐波那契数列的指定项
(2)要求用递归函数实现用函数计算斐波那契数列的指定项
9、素数:要求将判断一个整数是否为素数用函数实现。
(1)判断一个整数是不是素数,并且将判断一个整数是否为素数用函数实现。
(2)输入一组整数,共为n个,输出其中素数的个数。要求将判断一个整数是否为素数用函数实现。
10、因数个数之和
11、计算小母牛数量
12、求x的n次幂,要求用递归函数,其中n为非负整数。
13、累加和
14、利用函数计算平均值
(1)编写一个函数f(x)判断整数为正整数、负整数、还是零。 利用该函数实现计算输入的n个整数中正整数的平均值。
(2)编写计算数组a中前n个元素的平均值的函数,计算平均值
1、等差数列求和
编写一个函数sum,计算等差数列中前n项数据的和。已知等差数列的起始项为2。
例如:等差数列2,5,8,11…,需要利用sum函数求出前3项的和为15。
【题目要求】
① 等差数列中数字之间的差值不固定,需要自行输入。
② 输入要求的数列项数n。
③ 输出前n项数据的和。【输入描述】
两个正整数;
第一个正整数为数列中数字之间的差值(1≤差值≤50);
第二个正整数为求和数列的项数n(1≤n≤100);
两项内容中间用空格分隔。【输出描述】
一个正整数,代表前n项数据的和。用例输入:
4 5
用例输出:
50
#include <iostream>
using namespace std;
// 等差数列前 n 项和 Sn=n*a1+n(n-1)d/2
int arithmeticProgressionSum(int d, int n) {int a1 = 2, sum;sum = n * a1 + n * (n - 1) * d / 2; // Sn=n*a1+n(n-1)d/2return sum;
}
int main() {// differenceValue:差值,numberOfTerms:=n项数据int differenceValue = 1, numberOfTerms = 1; cin >> differenceValue >> numberOfTerms;int sum;sum = arithmeticProgressionSum(differenceValue, numberOfTerms);cout << sum << endl;return 0;
}
2、判断数字位数
编写一个函数get_length,计算输入的正整数有多少位。输入的第一个数字不为 0。
【输入描述】
一个正整数(不超过10位)。
【输出描述】
一个正整数,代表数字的位数。
方法一:用while
#include <iostream>
using namespace std;int get_length(int number) {int length = 0; // length获取数字的位数 // 注意:5/10 = 0while(number>0){number=number/10;length++;}return length;
}int main() {int number, count;cin >> number;count = get_length(number);cout << count;return 0;
}
方法二:用for
#include <iostream>
using namespace std;
int get_length(int number) {int length;// 注意:5/10 = 0for (length = 0;number > 0;length++) {number /= 10;}return length;
}
int main() {int number, count;cin >> number;count = get_length(number);cout << count;return 0;
}
3、有规律的图形
编写一个函数graph,输出一个a行b列(1≤a,b≤10000)由任意符号组成的矩形。
【输入描述】
一行,两个整数a, b(分别代表行与列,1≤a,b≤10000),一个字符,中间用空格分隔。
【输出描述】
a行b列由指定字符组成的矩形。
【用例输入】
3 4 @
【用例输出】
@@@@
@@@@
@@@@
#include <iostream>
using namespace std;
//定义输出有规律的图形的函数
void graph(int row,int column, char c) {for (int i = 1;i <= row;i++) {for (int j = 1;j <= column;j++) {cout << c;}cout << endl;}
}int main() {int row, column;char c;cin >> row >> column >> c;//调用函数graphgraph(row, column, c);return 0;
}
4、简易计算器
编写一个函数calcu进行四则运算的计算器。输入两个数,和四则运算符号,即可返回计算的结果。
【输入描述】
一行,两个正整数(1≤数字≤10000),一个字符(‘+’、‘-’、‘*’、‘/’),内容之间用空格分隔。
【输出描述】
一个整数,代表计算结果。
#include <iostream>
using namespace std;
void calcu(int number1, char opt, int number2) {switch (opt) {case '+':cout << number1 + number2;break;case '-':cout << number1 - number2;break;case '*':cout << number1 * number2;break;case '/':cout << number1 / number2;break;default:cout << "请输入正确的运算符" << endl;break;}
}
int main() {int number1, number2;char opt;cin >> number1 >> opt >> number2;calcu(number1, opt, number2);return 0;
}
5、素数对
两个相差为 2 的素数成为素数对,5 和 7,17 和 19,求出不大于 n 的素数对,没有输出 “empty”。n≤1000。
【输入描述】
输入一个 n。
【输出描述】
n 以内的素数对。
【用例输入】
11
【用例输出】
3 5
5 7
#include <bits/stdc++.h>
using namespace std;
int primeNumber(int x) {for (int i = 2;i <= sqrt(x);i++) { // sqrt()平方根函数// 如果 x 能被其他数整除,那就不是素数if (x % i == 0) {return 0; //不是素数 }}return 1; //是素数 }
int main() {int n,flag=0; // flag是用来判断有没有素数对 cin >> n;// 从2开始,因为要素数 for (int i = 2;i <= n-2;i++) {if ((primeNumber(i) == 1) && (primeNumber(i + 2) == 1)) {printf("%d %d\n",i,i+2);flag = 1;}}if (flag == 0) { // 思路陷阱:因为最终要判断结果是不是,所以需要用到flag cout << "empty";}return 0;
}
6、用函数打印金字塔
请输入金字塔层数:4
请输入金字塔符号:*
*
***
*****
******* 思路容易误解:星号之间没有空格,只是前面为空格,中间为星号
【分析】
若输入四层:外循环为4次
3空格 1星号
2空格 3星号
1空格 5星号
0空格 7星号
内层循环空格:
3空格:循环3次空格
2空格:循环2次空格
1空格:循环1次空格 循环次数=n-1-i(i=0开始)
内层循环星号:
方法一:
#include <iostream>
using namespace std; // 定义一个函数pyramid,用于打印金字塔形状 思路陷阱:打印到中间的*结束之后的空格不用管
// 参数n表示金字塔的层数,ch表示金字塔的符号,默认为'*'
void pyramid(int n,char ch='*') {for (int i = 0; i < n; i++) { // 外层循环,控制金字塔的层数for (int j = 0; j < n - 1 - i ; j++) { // 内层循环,打印每行前面的空格,使金字塔居中cout << " "; }for (int j = 0; j < 2 * i + 1; j++) { // 内层循环,打印每行的符号,形成金字塔的宽度cout << ch;}cout << endl; // 每打印完一行后换行}
}int main() { int n; cout << "请输入金字塔层数:"; cin >> n; char ch; cout << "请输入金字塔符号:"; cin >> ch; pyramid(n, ch); return 0;
}
方法二:仅用了system("pause")
#include <iostream>
#include <Windows.h> // 调用Windows API,这里主要用于system("pause")
using namespace std; // 定义一个函数pyramid,用于打印金字塔形状 思路陷阱:打印到中间的*结束之后的空格不用管
// 参数n表示金字塔的层数,ch表示金字塔的符号,默认为'*'
void pyramid(int n,char ch='*') {for (int i = 0; i < n; i++) { // 外层循环,控制金字塔的层数for (int j = 0; j < n - 1 - i ; j++) { // 内层循环,打印每行前面的空格,使金字塔居中cout << " "; }for (int j = 0; j < 2 * i + 1; j++) { // 内层循环,打印每行的符号,形成金字塔的宽度cout << ch;}cout << endl; // 每打印完一行后换行}
}int main(void) { int n; cout << "请输入金字塔层数:"; cin >> n; char ch; cout << "请输入金字塔符号:"; cin >> ch; pyramid(n, ch); // 调用pyramid函数,根据用户输入的层数和符号打印金字塔system("pause"); // 调用Windows API,使程序暂停,等待用户按键继续return 0; // 程序正常结束,返回0
}
7、用函数计算员工的平均工资
意思为把计算员工的平均工资编写为函数,其中数组作为函数参数
#include <iostream>
using namespace std;
int AverageSalary(int data[], int n) { // 数组作为函数参数int sum = 0;for (int i = 0; i < n; i++) {sum += data[i];}return sum / n;
}
int main() {int salary[5] = { 12000,20000,30000,45000,9500 };cout << AverageSalary(salary, 5) << endl;return 0;
}
8、用函数计算斐波那契数列的指定项
(1)要求用非递归函数实现用函数计算斐波那契数列的指定项
#include <iostream>
using namespace std;
long long fib(int n) {if (n < 0) {cout << "参数错误" << endl;return -1;}if (n == 1 || n == 2) {return 1;}long long a1 = 1;long long a2 = 1;long long tmp;for (int i = 3; i <= n; i++) {tmp = a1 + a2;a1 = a2;a2 = tmp;}return a2;
}
int main() { // 注意:int main(void)=int main()cout << fib(5) << endl; // 输出5 return 0;
}
(2)要求用递归函数实现用函数计算斐波那契数列的指定项
#include<stdio.h>
int fib(int n){if (n == 1 || n == 2)return 1;elsereturn fib(n - 1) + fib(n - 2);
}
int main(){printf("%d\n", fib(8));//输出21return 0;
}
9、素数:要求将判断一个整数是否为素数用函数实现。
(1)判断一个整数是不是素数,并且将判断一个整数是否为素数用函数实现。
#include <iostream>
#include <cmath>
using namespace std;
bool sushu(int num){if(num<2)return false;else{for(int i=2;i<=sqrt(num);i++){ // 注意:为<= ,不是< if(num % i==0)return false;}return true;}
}
int main(){int n;bool result; cin >> n;result=sushu(n);if(result)cout << n << "是素数";elsecout << n << "不是素数";
}
(2)输入一组整数,共为n个,输出其中素数的个数。要求将判断一个整数是否为素数用函数实现。
#include <iostream>
#include <cmath>
using namespace std;
bool sushu(int num){if(num<2)return false;else{// sqrt函数返回double类型,但在循环条件中应使用整数。可以直接使用整数来避免浮点数比较。i<=sqrt(num)for(int i=2;i<=sqrt(num);i++){ // 修改为<=以确保检查sqrt(num)本身if(num % i==0)return false;}return true;}
}
int main(){int i,n,a[20],count=0;bool result; cin >> n;for(i=0;i<n;i++)cin >> a[i];for(i=0;i<n;i++){result=sushu(a[i]); //易错:sushu()返回值为bool类型,所以需要和true、flase比较,不要和1和0比较。 if(result){ // 注意:if(result==true) 等于 if(result)cout << a[i] << "是素数" << endl;count++;}elsecout << a[i] << "不是素数" << endl;}cout << "素数的个数为:" << count; return 0;
}
10、因数个数之和
输入一组整数,共n个,计算这些整数的因数个数之和。要求计算一个整数的因数个数用函数实现。
#include <iostream>
using namespace std;
int yinshu(int num){int count=0;for(int i=1;i<=num;i++)if(num%i==0)count++;return count;
}
int main(){int i,n,a[20],sumCount=0;cin >> n;for(i=0;i<n;i++)cin >> a[i];for(i=0;i<n;i++)sumCount+=yinshu(a[i]);cout << sumCount;return 0;
}
11、计算小母牛数量
若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛。(用递归函数方法求解)
第1年:1头母牛
第2年:1头母牛
第3年:1头母牛
第n年(n>3):四个年头开始每年生一头母牛
第n-1年的母牛数量+第n-3年的母牛数量(因为每头母牛从第四年n年开始生育,生育第n-3年个新母牛)
输入样例:7
输出样例:6
#include <iostream>
using namespace std;
// 递归函数,计算第n年的母牛数量
int cowCount(int n) {// 基本情况:前3年每年只有1头母牛if (n == 1 || n == 2 || n == 3) {return 1;}// 递归情况:第n年的母牛数量等于第n-1年的数量加上第n-3年的数量所生的新母牛return cowCount(n - 1) + cowCount(n - 3);
}
int main() {int n;cout << "请输入年份n: ";cin >> n;// 调用递归函数计算第n年的母牛数量,并输出结果cout << "第" << n << "年的母牛数量为: " << cowCount(n) << endl;return 0;
}
12、求x的n次幂,要求用递归函数,其中n为非负整数。
#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;
}
13、累加和
编写一个函数f(n)=1+2+…+n,利用该函数计算并输出f(m)+f(n)。
#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; // f(3)+f(5)=21return 0;
}
14、利用函数计算平均值
(1)编写一个函数f(x)判断整数为正整数、负整数、还是零。 利用该函数实现计算输入的n个整数中正整数的平均值。
#include<iostream>
using namespace std;
// 判断整数为正整数、负整数、还是零
int f(int x)
{if (x > 0)return 1;else if (x < 0)return -1;elsereturn 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;
}
(2)编写计算数组a中前n个元素的平均值的函数,计算平均值
#include<iostream>
using namespace std;
// 计算数组a中前n个元素的平均值
double avge(int a[20],int n) //double返回类型以支持小数结果
{int sum=0;for(int i=0;i<n;i++)sum+=a[i];//注意:static_cast<double>类型转换,其中cast为类型转换的意思 return static_cast<double>(sum)/n; // 强制转换sum为double进行除法
}
int main()
{int n,a[20];cin >> n;for (int i = 0; i < n; i++) cin >> a[i]; // 易错:不是avge(a[i],n),而是avge(a,n),因为a[i]为单个元素,但是要输入整个数组 cout <<avge(a,n) << endl; return 0;
}