C语言函数在线练习题3
1. 杀鸡用牛刀(3级)1
【题目描述】
哈哈!我们终于学了递归了,现在大家一定感到非常有意思吧,那个典型的"汉诺塔"问题,一个非常短的程序居然可以完成如此复杂的工作,真是神奇啊!来吧,让我们也动手编写一个递归程序,当然,我们要编写的不可能太复杂。功能:从键盘录入两个数n和m来表示一个区间, n 为区间的起始点,m为区间的终止点 ,求整数 n 到 m 区间的累加和,其中n<=m。
【输入】
两个整数n和m。
【输出】
n 到 m 区间的累加和。
【样例输入】
1 100
【样例输出】
5050
参考代码:#include int GetSum(int n,int m) { if(n==m) return n; else return (m+GetSum(n,m-1)); } int main() { int m,n,s; scanf("%d%d",&n,&m); s=GetSum(n,m); printf("%d ",s); return 0; }
2. 求最大公约数(3级)1
【题目描述】
请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。
【输入】
两个整数n和m。
【输出】
两个整数的最大公约数。
【样例输入】
24 48
【样例输出】
24
参考代码:#include "stdio.h" int Gcd(int n,int m) { if(m<=n&&n%m==0) {return m;} else if(n 【样例输出】
1
参考代码:#include int Fun(int n) { if(n==1||n==2) {return 1;} else if(n%2!=0) {return (Fun(n-1)+Fun(n-2));} else {return (Fun(n-1)-Fun(n-2));} } int main() { int n; scanf("%d",&n); printf("%d ",Fun(n)); return 0; }
4. 富翁与骗子(3级)Y 1
【题目描述】
据说有个智商不高的富翁和一个智商较高的骗子。有一天骗子对富翁说:"我搞了一个基金会,你将短期不用的富余资金存到我这里吧。第一天你只需要存入一元,第二天存入两元,以此类推,以后每天存入的资金是前一天的2倍,直到若干天期满为止。与此同时,你可以每天最多支取一笔价钱不菲的金额。"俩人按照上述要求立字据,合约执行若干天后结束,到时两人互不相欠。
现要求编写两个函数Deposit()和Withdraw()分别计算富翁的存入和支取金额,并编写程序调用这两个函数判断骗子要想骗取富翁的金钱,合约需要执行的最少天数,以及骗子总共骗取的金钱数,其中通过输入获得富翁每天可以支取的最大金额数。其中录入数据格式要求有多行。第一行输入一个整数n,表示有n行测试数据。以下有n行数据,每行数据表示富翁每天可以支取的最大金额数amount(1<=amount<=1000000),单位为元。输出有n行。每行两个数据,第1个数据表示,骗子要想骗取富翁的金钱,根据富翁每天可以支取的最大金额数,判断出的合约需要执行的最少天数;第2个数据表示骗子所骗取的金钱数。
【输入】
有多行。第1行输入一个整数n,表示有n行测试数据。以下有n行数据,每行数据表示富翁每天可以支取的最大金额数amount(1<=amount<=1000000),单位为元。
【输出】
有多行。每行两个数据,第1个数据表示,骗子要想骗取富翁的金钱,根据富翁每天可以支取的最大金额数,判断出的合约需要执行的最少天数;第2个数据表示骗子所骗取的金钱数。
【样例输入】
2
300000
400000
【样例输出】
23天骗取现金1488607元
24天骗取现金7177215元
参考代码:#include long long int Deposit(int n) { int i; long long int s=0,a=1; for(i=1;i<=n;i++) {s=s+a; a=2*a; } return s; } int Withdraw(int a,int b) { return a*b; } int main() { int n,i,day; int amount,dpt,wd; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&amount); for(day=1;;day++) { dpt=Deposit(day); wd=Withdraw(day,amount); if(dpt-wd>0) { printf("%d天骗取现金%d元 ",day,dpt-wd); break; } } } return 0; }
5. Hanoi(汉诺)塔问题(3级)1
【题目描述】
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子A、B、C,在一根柱子A座上有64个黄金圆盘(如图所示),盘子大小不等,大的在下,小的在上 。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放从A座移到在另一根柱子C座上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。且在移动过程中在3个座上始终保持大盘在下,小盘在上。在移动地程中可以行用B座柱子,要求编程序打印出移动的步骤。
有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今还在一刻不停地搬动着圆盘。
【输入】
一个整数n,表示有n个盘子。
【输出】
具体的移盘步骤。
【样例输入】
3
【样例输出】
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
参考代码:
#include void move(char getong,char putone) { printf("%c--->%c ",getong,putone); } void hanoi(int n,char one,char two,char three) { if(n==1) { move(one,three); } else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } int main() { int n; scanf("%d", &n); hanoi(n, "A", "B", "C"); return 0; }
6. 数星星(2级)Y 3
【题目描述】
天空非常晴朗,外面很静很静,连小虫儿的鸣叫声都能听见。天就渐渐变黑了,天空中出现了一颗颗星星,它们一闪一闪的好像在眨着眼睛又好像在向我述说着什么似的。望着,望着,我就禁不住要数星星了,一颗,两颗,三颗,四颗,五颗……数着,数着,就分不清哪些数过了,哪些还没数过。你能帮忙数清天上有几颗星星吗?
【输入】
第一行有一个整数N(0< N<=100),接下来有N行N列字符。*代表星星,#代表天空。
【输出】
输出星星数。
【样例输入】
3
#*#
##*
***
【样例输出】
5
参考代码:#include #define N 100 void CountStars(char stars[][N], int w, int*count) { int i, j; *count = 0; for (i = 0; i <= w; i++) { for (j = 0; j <= w; j++) { if (stars[i][j] == "*") *count = *count + 1; } } } int main() { int w,i,j,count; char stars[N][N]; scanf( "%d", &w ); getchar(); //吸收回车符 for ( i = 0; i < w; i++ ) fgets( stars[i], 200, stdin ); CountStars( stars, w, &count ); printf( "%d ", count ); return 0; }
7. 日期转换(3级)Y 3
【题目描述】
2014年是一个平年,农历甲午年,所属生肖马。2014年年历如下图
现在已知2014年的第几天,计算出它是几月几日
【输入】
一个整数n,表示2014年的第几天。
【输出】
输出对应的是几月几日。
【样例输入】
173
【样例输出】
6月22日
参考代码:#include void fun(int n,int *month,int *day) { int i,a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; for(i = 1; i < 13; i ++) { n -= a[i]; if(n < 0) { *month = i; break; } } *day = n + a[i]; } int main() { int n,month,day; scanf("%d",&n); fun(n,&month,&day) ; printf("%d月%d日 ",month, day) ; return 0; }
8. 吃巧克力(2级)1
【题目描述】
2013年12月8日,ACM俱乐部的小武代表学校参加了在吉林大学举办的第38届ACM国际大学生程序设计竞赛现场赛,返校时带了一盒好吃又精美的巧克力给滨滨(盒内共有 N 块巧克力,20 > N >0)。
小武告诉滨滨每天可以吃一块或者两块巧克力。假设滨滨每天都吃巧克力,问滨滨共有多少种不同的吃完巧克力的方案。
例如:
如果N=1,则滨滨第1天就吃掉它,共有1种方案;
如果N=2,则滨滨可以第1天吃1块,第2天吃1块;也可以第1天吃2块,共有2种方案;
如果N=3,则滨滨第1天可以吃1块,剩2块;也可以第1天吃2块剩1块,共有2+1=3种方案;
如果N=4,则滨滨可以第1天吃1块,剩3块;也可以第1天吃2块,剩2块,共有3+2=5种方案。
【输入】
一个正整数N。
【输出】
滨滨吃巧克力的方案数目。
【样例输入】
4
【样例输出】
5
参考代码:#include #include int Func(int n) { int c=0; if(n==1) c=1; if(n==2) c=2; if(n>=3) c=Func(n-1)+Func(n-2); return c; } int main( ) { int n; scanf("%d",&n); printf("%d ",Func(n)); return 0; }
9. 兔子繁殖(2级)1
【题目描述】
一般的,兔子在出生一个月后就有繁殖能力。假设一对兔子(一雌一雄)每个月可繁殖出一对小兔子来,并且所有的兔子都不死,这样从第一个月开始在笼中圈养一对有繁殖能力的小兔子,那么month个月可以繁殖多少对兔子。
【输入】
一个正整数month(1 < month < 20)。
【输出】
可以繁殖的兔子对数。
【样例输入】
5
【样例输出】
8
参考代码:#include #include int Func(int n) { int c=0; if(n==1) c=1; if(n==2) c=2; if(n>=3) c=Func(n-1)+Func(n-2); return c; } int main( ) { int month; scanf("%d",&month); printf("%d ",Func(month)); return 0; }
10. 数组转置(1级)2
【题目描述】
编写函数,使输入的3*3的二维整型数组转置,即行列互换。
【输入】
一个3*3的二维数组。
【输出】
转置后的数组。
【样例输入】
1 2 3
4 5 6
7 8 9
【样例输出】
1 4 7
2 5 8
3 6 9
参考代码:#include #define N 3 int array [N][N]; void convert(int array[][3]) { int i,j,t; for(i=0; i