目录

  • 1.汉诺塔
    • 题目:
    • 代码:
  • 2.阿克曼
    • 题目:
    • 代码:
  • 3.回文数
    • 题目:
    • 代码:
  • 4.为素数的因数
    • 题目:
    • 代码:
  • 5.分数序列和
    • 题目:
    • 代码:
  • 6.星期几
    • 题目:
    • 代码:
  • 7.特殊求和
    • 题目:
    • 代码:
  • 8.杨辉三角形
    • 题目:
    • 代码:
  • 9.比较两组整数
    • 题目:
    • 代码:

1.汉诺塔

题目:

汉诺塔问题是指:一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 B 针上,每次只能移动一个圆盘,移动过程可以借助 C 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。

对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 B 针。若移动的圆盘为 n(n>1),则分成几步走:
1、把 (n-1) 个圆盘从 A 针移动到 C 针(借助 B 针);
2、A 针上的最后一个圆盘移动到 B 针;
3、C 针上的 (n-1) 个圆盘移动到 B 针(借助 A 针)。

每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。
因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。

函数设计如下:
void Hanoi(int n, char a, char b, char c);
void Move(int n, char a, char b);
请注意定义全局变量记录移动次数。

【样例输入】

3

【样例输出】

1: Move 1 from A to B
2: Move 2 from A to C
3: Move 1 from B to C
4: Move 3 from A to B
5: Move 1 from C to A
6: Move 2 from C to B
7: Move 1 from A to B

代码:

#include <iostream>
using namespace std;//函数功能:将n个盘从a借助c挪到b;
int i = 0;
void Move(int n, char a, char b)
{i ++;cout << i << ": Move " << n << " from " << a << " to " << b << endl;
}
void Hanoi(int n, char a, char b, char c)
{if(n == 1){Move(n, a, b);}else{Hanoi(n - 1, a, c, b);Move(n, a, b);Hanoi(n - 1, c, b, a);}
}
int main()
{int n;char a, b, c;a = 'A';b = 'B';c = 'C';cin >> n;Hanoi(n, a, b, c);return 0;
}

2.阿克曼

题目:

编程计算Ackermann阿克曼函数的值,定义一个int Ack(int m, int n)的递归函数,在主函数中输入m和n,调用该递归函数返回其值。Ack(m,n)的定义如下(m≥0,n≥0):

Ack(0,n) = n+1

Ack(m,0) = Ack(m-1,1)

Ack(m,n) = Ack(m-1,Ack(m,n-1)) (m>0, n>0)

同时,请打印出计算Ackermann函数时所需的递归调用次数。

【输入形式】m和n
【输出形式】函数结果和递归调用次数。
【样例输入】2 3
【样例输出】

9
nAckNum=44

代码:

#include <iostream>
using namespace std;int k = 0;
int Ack(int m, int n)
{k ++;if(m < 0 || n < 0) return -1;if(m == 0) return n + 1;if(n == 0) return Ack(m - 1, 1);if(m != 0 && n != 0) return Ack(m - 1, Ack(m, n - 1));return 0;
}int main()
{int m, n;int result;cin >> m >> n;result = Ack(m, n);if(result == -1) return 0;else{cout << result << endl;cout << "nAckNum=" << k;}return 0;
}

3.回文数

题目:

所谓回文数是指具有如下性质的整数:一个整数,当它的各位数字逆序排列,形成的整数与原整数相同,这样的数称为回文数。例如,素数11是回文数,373也是回文数,因为其各位数字对换位置后仍然为11、373。编写函数int Loop(int x),判断一个整数x是否为回文数,如果x是回文数则返回1(或者true),否则返回0(或者false)。编写程序,接收控制台输入的两个整数a,b。调用Loop函数输出a到b之间(包括a和b)的所有为偶数的回文数。
【输入形式】控制台输入两个整数a和b(必有a<b),以空格分隔。
【输出形式】输出有若干行,每行有一个a和b之间的回文数。输出各行上的数字不重复,且从小至大依次按序输出。
【样例输入】3 120
【样例输出】
4
6
8
22
44
66
88
【样例说明】输入整数a=3,b=120,要求输出所有[3, 120]之间的为偶数的回文数。按升序分行输出所有符合题意的整数。

代码:

#include <iostream>
using namespace std;int Loop(int x)
{int sum = 0, n = x;while(n > 0){sum = sum * 10 + n % 10;n = n / 10;}if(x == sum) return 1;else return 0;
}int main()
{int a, b, i, n;do{cin >> a >> b;}while(a >= b);for(i = a; i <= b; i ++){n = Loop(i);if(i % 2 == 0 && n == 1)cout << i << endl;}return 0;
}

4.为素数的因数

题目:

请编写一个函数,完成以下计算:在主函数中接受输入整数n(n>0),调用函数计算并输出n的所有为素数的正因数,若没有则在返回主函数以后输出No Answer。

【输入形式】从控制台输入整数n。

【输出形式】按照从小到大的顺序,在一行上输出n的所有为素数的正因数,各个正因数之间用一个空格分隔,若没有则输出No Answer。

【样例输入】36

【样例输出】2 3

【样例输入】1

【样例输出】No Answer

【样例说明】输入的整数N为36,36的所有正因数为1、2、3、4、6、9、12、18、36,其中只有2和3为素数,所以输出2 3。

【样例说明】如果测试数据是11,则输出11。注意本身也是因子的素数。

代码:

#include <iostream>
using namespace std;int prime(int x)
{for(int i = 2; i < x; i ++) if(x % i == 0) return 0;return 1;
}void func(int n)
{int flag = 0;for(int i = 2; i <= n; i ++){if(n % i == 0){if(prime(i) == 1)cout << i << " ";flag = 1;}}if(flag == 0) cout << "No Answer";
}int main()
{int n;cin >> n;func(n);
}

5.分数序列和

题目:

编写函数double FUN(double n)计算以下分数序列的前n项之和,其中参数n由主函数输入,FUN函数的返回值在主函数中输出。

2/1,3/2,5/3,8/5,13/8,21/13,…

【输入形式】正整数n

【输出形式】分数序列的和(浮点数,精确到小数点后4位)

【样例输入】99

【样例输出】160.4849

【提示】因为运行时间的限制,请不要使用递归函数。注意int类型存储越界的问题。

代码:

#include <iostream>
#include <iomanip>using namespace std;double FUN(double n){double a = 2.0;double b = 1.0;double r = 0.0;for(int i = 1; i <= n; i++){r += (a / b);double temp = a;a += b;b = temp;}return r;
}
int main(){int n;double r;cin >> n;r = FUN(n);cout << fixed << setprecision(4) << r;return 0;
}

6.星期几

题目:

编写一个原型为bool LeapYear(int year)的函数判断某年是否为闰年。

编写一个原型为int GetDays(int year, int month, int day)的函数,计算从公元1年1月1日到该日期第year年month 月day日的天数。

通过对年的循环,依次累加求和即可:sum+=365 or 366。另外:主函数要求输入年月日,并计算出当天是XINGQI几。其中1、2、…、6、7依次输出为XINGQI 1、XINGQI 2、…、XINGQI 6、XINGQI 7。

bool LeapYear(int year);

int GetDays(int year, int month, int day);

【输入形式】**year month day

【输出形式】**XINGQI 1、XINGQI 2……XINGQI 6、XINGQI 7中的一个,拼音和数字之间有一个空格

【样例输入】2011 11 3

【样例输出】XINGQI 4

代码:

#include <iostream>
#include <iomanip>using namespace std;bool LeapYear(int year){if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ) return true;else return false;
}int GetDays(int year, int month, int day){int t = 0;for(int i = 1; i < year; i ++){if(LeapYear(i)) t += 366;if(!LeapYear(i)) t += 365;}for(int i = 1; i < month; i ++){switch(i){case 1 : t += 31; break;case 3 : t += 31; break;case 5 : t += 31; break;case 7 : t += 31; break;case 8 : t += 31; break;case 10 : t += 31; break;case 12 : t += 31; break;case 4 : t += 30; break;case 6 : t += 30; break;case 9 : t += 30; break;case 11 : t += 30; break;case 2:if(LeapYear(i)) t += 29;if(!LeapYear(i)) t += 28;}}t += day;return t;
}int main(){int n, y, r, t;cin >> n >> y >> r;t = GetDays(n, y, r);cout << "XINGQI " << (t % 7);return 0;
}

7.特殊求和

题目:

编写函数int fun(int a,int n)求Sn = a + aa + aaa + … + aa…a 的值(最后一个数中 a 的个数为 n ),其中 a 是一个1~9的数字,例如:

2 + 22 + 222 + 2222 + 22222 (此时 a=2 n=5 ) 。参数由主函数传入,最终结果传回主函数再输出。

【输入形式】一行,包括两个整数,第一个为a,第2个为n(1 ≤ a, n ≤ 9),以空格分隔。

【输出形式】一行,Sn的值。

【样例输入】2 5

【样例输出】24690

代码:

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

8.杨辉三角形

题目:

请编写函数求解实现用一维或二维数组存储杨辉三角形,并编写函数实现在屏幕上显示如下杨辉三角形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

【输入形式】

从键盘输入整数n(n>=0且n<=12)
【输出形式】
在屏幕上输出n+1行杨辉三角形。

【输入样例1】
3
【输出样例1】
1
1 1
1 2 1
1 3 3 1

代码:

#include <iostream>
#include <iomanip>
using namespace std;void Yanghui(int n){int s[20][20];for(int i = 0; i <= n; i ++){s[i][0] = 1;s[i][i] = 1;}for(int i = 2; i <= n; i ++){for(int j = 1; j < i; j ++){s[i][j] = s[i - 1][j - 1] + s[i - 1][j];}}for(int i = 0; i < n; i ++){for(int j = 0; j < 2 * (n - i); j ++) cout << " ";for(int k = 0; k <= i; k ++){cout << setw(4) << s[i][k];}cout << endl;}
}int main(){int n;do{cin >> n;}while(n < 0 || n > 12);Yanghui(n);return 0;
}

9.比较两组整数

题目:

编写一个函数实现数组元素的录入,编写第二个函数实现数组元素的输出,编写第三个函数实现以下功能:比较两组整数是否有相同的元素,并打印输出这些相同的元素,不考虑元素的顺序,并忽略元素重复的情况,每组元素个数不超过100。例如:
2 5 10 17 10 8 5 10 12
与下列一组整数:
12 8 10 17 5 2
相同。

若需要其他函数请自行设计,原则是主函数尽量短小、清晰,代码整体可读性强。
【输入形式】
首先输入第一组整数的个数,再输入第一组整数,以空格分割;然后输入第二组整数的个数,再输入第二组整数,以空格分割。
【输出形式】
打印两组整数中相同的元素,顺序以第一组的整数输入顺序为准,如果没有相同元素,打印“No Answer”
【输入样例1】

9
2 5 10 17 10 8 5 10 12

6
12 8 10 17 5 2
【输出样例1】

"#"代表空格
2#5#10#17#8#12#
【样例1说明】
输入两组整数
2 5 10 17 10 8 5 10 12
12 8 10 17 5 2
由于这两个数组具有相同的元素,顺序打印第一行与第二行相同的元素

【样例输入2】

7
3 4 7 8 1 22 3
6
1 9 43 5 6 78

【样例输出2】

1

代码:

#include <iostream>
#define N 100
using namespace std;int flag =0;void Input(int s[], int num)
{for(int i = 0; i < num; i ++){cin >> s[i];}
}void Sort(int a[], int b[], int as, int bs)
{for(int i = 0; i < as; i ++){for(int j = 0; j < bs; j ++){if(a[i] == b[j]){cout << b[j] << ' ';flag = 1;b[j] = -1;}}}if(!flag) cout << "NO ANSWER";
}int main()
{int anum;cin >> anum;int a[N];Input(a, anum);int bnum;cin >> bnum;int b[N];Input(b, bnum);Sort(a, b, anum, bnum);return 0;
}

欢迎提问,学弟学妹们加油~

第六周:数组 + 递归 + 函数相关推荐

  1. C语言编程>第二十六周 ⑥ 请补充fun函数,该函数的功能是:按 “0”到 “9”统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。注意:不能使用字符串库函数。

    例题:请补充fun函数,该函数的功能是:按 "0"到 "9"统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中.注意:不能使用字符串库函数. ...

  2. C语言编程>第二十六周 ① 函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。

    例题:函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换.形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动. 例如,若a所指数组中的数据依次为:11 22 33 ...

  3. C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。

    例题:编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中. 在主函数中调用该函数计算出这n个整数之和. 代码如下: /*代码分析:录入函数需要两个参数:一个参数是需要用来存储数字的数组, ...

  4. C语言编程>第十六周 ⑧ S是一个由数字和字母字符串组成的字符串,由变量len传入字符串长度。请补充fun函数,该函数的功能是把字符串s中的数字字符转换成数字并存放到整型数组a中

    例题:S是一个由数字和字母字符串组成的字符串,由变量len传入字符串长度.请补充fun函数,该函数的功能是把字符串s中的数字字符转换成数字并存放到整型数组a中,函数返回数组a的长度. 例如,s=&qu ...

  5. c语言prime函数怎么用_C语言入门——第六周笔记——数组运算

    周围太安静了,安静到现在就算有一根针掉地上也能听到清脆的一声响. 我抬头看了看大哥,大哥,生气了. --纹路 数组运算 数组运算 数组的集成初始化 int 这次对数组的赋值很上次有明显的不同,这次并没 ...

  6. C语言编程>第六周 ⑥ 输入一串字符,统计大大写字母的个数,并强调统计必须用函数。

    例题:输入一串字符,统计大大写字母的个数,并强调统计必须用函数. 代码如下: #include <stdio.h> #include <string.h>//字符头文件 int ...

  7. C语言编程>第十六周 ② 函数fun的功能是:统计长整数test的各位上出现数字5、6、7的次数,并通过外部(全局)变量sum5、sum6、sum7返回主函数。

    例题:函数fun的功能是:统计长整数test的各位上出现数字5.6.7的次数,并通过外部(全局)变量sum5.sum6.sum7返回主函数. 例如:当test=89431676时,结果应该为:sum5 ...

  8. C语言编程>第十六周 ⑦ s是全部由小写字母字符和空格字符组成的字符串,由len传入字符串的长度,请补充fun函数,该函数的功能是:统计字符串s中的单词数,结果由变量len传回。

    例题:s是全部由小写字母字符和空格字符组成的字符串,由len传入字符串的长度,请补充fun函数,该函数的功能是:统计字符串s中的单词数,结果由变量len传回.每个单词之间都由空格隔开,并且字符串s开始 ...

  9. 递归——函数在内部自己调用自己,那么该函数是递归函数 作用和循环效果一样 要加推出条件return,否则发生栈溢出,导致死循环 递归给数组中对象添加属性 toString()和随机数

    递归--函数在内部自己调用自己,那么该函数是递归函数 & 作用和循环效果一样 & 要加推出条件return,否则发生栈溢出,导致死循环 & 递归给数组中对象添加属性 & ...

最新文章

  1. 2021.5.13指导论文
  2. python之绝对导入和相对导入
  3. spring框架三层架构_Spring框架架构
  4. 液位单闭环实验计算机控制,过程控制实验指导书
  5. 70. Climbing Stairs 题解
  6. Centos 7 安装shellcheck
  7. RCE 0day影响数万台QNAP SOHO NAS 设备
  8. 获取自Linux上的Epoch以来的当前时间,Bash
  9. spring StopWatch用法
  10. 企业信息化建设的重要意义及注重方向
  11. MD5 文件校验之 java 实现
  12. Ps 初学者教程「68」如何创建海报?
  13. CSS 3 动画 实现图片动态切换
  14. 按键精灵获取14位纯数字当前时间,时间格式yyyyMMddHHmmss
  15. 常见的Cracker攻击手法
  16. 百度为何力推直达号?为了移动商业化
  17. 47 软件工程34h-北京大学孙艳春老师
  18. 解决maven打包时手动添加的依赖jar包打不进去的情况
  19. 微信ndows mac下载,Mac版微信又更新,Windows电脑:就这?
  20. 有趣的数字环的算法实现

热门文章

  1. eNSP配置IS-IS(中间系统到中间系统)
  2. 番茄时间--2018年1月27日
  3. 365gps怎样修改服务器,gps365定位器怎么用(gps定位器ID号怎么获取)
  4. Python中的 if __name__ == __main__到底是个啥意思?
  5. Rust 日期与时间之chrono
  6. python 对7位数彩票的获奖判断
  7. linux下的sed用于分类标签的建立
  8. 第二届BMZCTF网络安全公开赛
  9. python蟒蛇代码解析_Python绘制蟒蛇代码理解
  10. 单片机延时程序的实现