第 7 章 函数与递归 1.简单算术表达式求值#includebits/stdc.h//万能头 using namespace std;//使用std命名空间 int main(){//主函数 int n1,n2;char ch;//n1为第一个运算数n2为第二个运算数ch为运算符 cinn1chn2;//输入由于cin读取数字的特殊方式当读取出非数字字符时会将其留在缓冲区不做处理所以我们可以这样连用cin switch(ch){//switch 语句测试一个变量等于多个值时的情况。 case ://当运算符为时 cout(n1n2);//输出第一个运算数加第二个运算数 break;//退出switch case -://当运算符为-时 coutn1-n2;//输出第一个运算数减第二个运算数 break;//退出switch case *://当运算符为*时 coutn1*n2;//输出第一个运算数乘第二个运算数 break;//退出switch case /://当运算符为/时 coutn1/n2;//输出第一个运算数除第二个运算数 break;//退出switch case %://当运算符为%时 coutn1%n2;//输出第一个运算数对第二个运算数取模 break;//退出switch } return 0;//返回0 }2.最⼤数 max(x,y,z)#include iostream #include algorithm using namespace std; int main() { double a, b, c; cin a b c; cout fixed setprecision(3) max({a, b, c}) / (max({a b, b, c}) * max({a, b, b c})) endl; return 0; }3.最⾼分和最低分之差#includebits/stdc.h using namespace std; int main() { int n0; cinn; int max0; int num0; int min10001; while(n--) { cinnum; if(maxnum) { maxnum; } if(minnum) { minnum; } } coutmax-min; }4.歌唱⽐赛#includebits/stdc.h using namespace std; double a[105][25]; double q[105]; double w[105]; int main(){ int n,m; cinnm; double sum0; for(int i1;in;i){ w[i]15; } for(int i1;in;i){ for(int j1;jm;j){ cina[i][j]; w[i]min(a[i][j],w[i]); q[i]max(a[i][j],q[i]);//记录最高分和最低分。 } } for(int i1;in;i){ double s0; for(int j1;jm;j){ sa[i][j];//计算每名同学的总得分。 } s-w[i]; s-q[i];//减去最低分和最高分。 summax(sum,s);//记录最高的总得分。 } printf(%.2lf,sum/(m-2)); }5.求正整数 2 和 n 之间的完全数#includeiostream using namespace std; bool check(int x){ int sum0; for(int i1;i*ix;i){//从1枚举到x的平方根就可以了降低时间复杂度。 if(x%i0){ sumi; if(i*i!x)sumx/i;//因为如果i是x的因数则x/i也是x的因数。 //但是如果x是平方数的话则x的平方根会被重复计算须加上特判。 } } return sum-xx; //因为sum-xx本身就是布尔表达式所以可以直接返回。 } int main(){ for(int i2;i10000;i){ if(check(i))coutiendl; } return 0; }6.甲流病⼈初筛#includebits/stdc.h using namespace std; int n,cough,ans; string name; //循环n次读入可以重复使用变量 double temp; int main() { cinn; for(int i1;in;i) { cinnametempcough; //读入病人的信息 if(temp37.5cough) //如果符合筛查条件 { coutnameendl; //输出名字 ans; //被初筛为甲流的病人数量1 } } coutansendl; //输出被初筛为甲流的病人数量 return 0; }7.素数个数#includecstdio using namespace std; int n,pri[50005]{},cnt0; int main(){ scanf(%d,n);//输入 for(int i2;in;i){//埃氏筛法 if(pri[i])continue; for(int jii;jn;ji)pri[j]1;//质数的几倍是合数 } for(int i2;in;i)if(!pri[i])cnt;//统计质数 printf(%d,cnt);//输出 return 0; }8.素数对#includebits/stdc.h using namespace std; int n; bool prime(int x)//判断是否为质数的函数 { if(x1) return false; if(x2) return true; int j2; while(j*jx x%j!0) j; if(x%j0) return false; else return true; } bool pdtrue; int main() { cinn; for(int i3;in;i) { if(prime(i) prime(i-2))//枚举 { couti-2 iendl; pdfalse; } } if(pd) coutemptyendl; //若没有找到则输出 empty return 0; }9.素数回⽂数的个数#includebits/stdc.h using namespace std; bool ss(int x)//判断素数 { for(int i2;ix-1;i) if(x%i0) return false; return true; } bool hw(int x)//判断回文数 { int t0,m0,a[15],b[15]; while(x!0) { t; a[t]x%10; x/10; } for(int it;i1;i--) { m; b[m]a[i]; } for(int i1;it;i) if(a[i]!b[i]) return false; return true; } int main() { int n,ans0; cinn; for(int i11;in;i) if(hw(i)ss(i))//如果两个条件均符合计数器就加一 ans; coutans; return 0; }10.区间内的真素数#include iostream #include string #include algorithm using namespace std; int n, m;bool f, b; bool isp(int n) { if(n 1) return 0; if(n 2) return 1; if(n % 2 0) return 0; for(int i 3;i * i n;i) if(n % i 0) return 0; return 1; } int main() { cin n m; for(int i n;i m;i) { string t to_string(i); reverse(t.begin(), t.end()); int j stoi(t); if(isp(i) isp(j)) { if(f) cout ,; cout i;f 1;b 1; } } if(!b) cout No; return 0; }11.计算阶乘#include bits/stdc.h using namespace std; int f(int x) { if (x 0) return 1; return f(x - 1) * x; } int n; int main() { cin n; cout f(n) endl; return 0; }12.求第n个斐波那契数#includebits/stdc.h using namespace std; int n; int main(){ cinn; for(int i1;in;i){ int a; cina; int x[40]; x[1]x[2]1; for(int i3;ia;i) x[i]x[i-1]x[i-2]; coutx[a]endl; } return 0; }13.求 123...N 的值#includebits/stdc.h using namespace std; int f(int n){ if(n1)return 1; return f(n-1)n; } int main(){ int n; cinn; coutf(n)endl; return 0; }14.阿克曼Ackermann函数#include bits/stdc.h using namespace std; int a, b; int ack(int a, int b){ if (a 0) return b 1; if (b 0) return ack(a - 1, 1); // 递归边界 return ack(a - 1, ack(a, b - 1)); // 函数递归调用 } int main(){ cin a b; cout ack(a, b); }15.digit 函数#includebits/stdc.h using namespace std; char a[20];//以字符串的形式存储整数 int k,lena;//lena表示字符串的长度 int main() { cinak; lenastrlen(a);//strlen函数返回字符数组的长度 couta[lena-k];//输出右边第k位 return 0; }16.求 f(x,n)​ #include cstdio #include cmath using namespace std; inline double f(double x, int n) { if(n 1) return sqrt(n f(x, n - 1)); else return sqrt(1 x); } ​17.再求 f(x,n)18.进制转换