24.:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
27.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
29.给n位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
21.猴子吃桃问题
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。22.两个乒乓球队进行比赛,各出三人
#include <stdio.h>
double diGui(int n);
int main(){
int n=1;
printf("第一天共摘了%f",diGui(n));
return 0;
}
//写一个递归函数
double diGui(int n){
double sum;
if(n==10)
sum=1;
else
sum = ((diGui(n+1)+1)*2);
return sum;
}
结果:
第一天共摘了1534.000000
22.两个乒乓球队进行比赛,各出三人
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
三队赛手的名单。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
#include <stdio.h>
int main(){
char i,j,k;
for(i='x'; i<='z';i++)
for(j='x'; j<='z'; j++)
for(k='x'; k<='z';k++)
if(i!=j && i!=k && j!=k)
if(i!='x'&& k!='x' && k!='z')
printf("a--%c,b--%c--,c--%c",i,j,k);
return 0;
}
结果:
a--z,b--x--,c--y
23.打印出如下图案(菱形)
#include <stdio.h>
int main(){
int n=9,i,j,k;
for(i=1;i<=n;i++){ //这个i表示有多少行
if(i<(n-1)/2+1){
for(j=1;j<=(n-1)/2-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
}else{
for(j=0;j<=(i-(((n-1)/2+1)));j++)
printf(" ");
for(k=1;k<=((n-1)/2+1)-(i-((n-1)/2+1))*2;k++)
printf("*");
}
printf("\n");
}
}
*
***
*****
*******
*****
***
*
24.:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
#include <stdio.h>
double sum(int n);
int main(){
int n;
printf("求这个数列第n项,n=");
scanf("%d",&n);
printf("2/1+3/2+......=%lf",sum(n));
return 0;
}
double sum(int n){
int temp,i;
double fenzi=2, fenmu=1, sum=0;
for(i=0; i<n; i++){
sum += fenzi/fenmu;
temp = fenzi;
fenzi = fenzi+fenmu;
fenmu = temp;
}
return sum;
}
结果:
求这个数列第n项,n=20
2/1+3/2+......=32.660261
25.求1+2!+3!+...+20!的和
程序分析:此程序只是把累加变成了累乘。
#include <stdio.h>
long factorial(int n);
int main(){
int n;
printf("求多大的阶乘n=");
scanf("%d",&n);
printf("1+2!+3!+..=%ld",factorial(n));
return 0;
}
//阶乘
long factorial(int n){
int i, sum=1;
long sums=0;
for(i=1;i<=n;i++){
sum *= i; //最巧妙的地方!!!!
sums += sum;
}
return sums;
}
结果:
求多大的阶乘n=3
1+2!+3!+..=9
26.利用递归方法求5!
#include <stdio.h>
int diGui(int n);
int main(){
int n;
printf("请输入你想要的递归数n=");
scanf("%d",&n);
printf("1!+2!+...%d!=%d",n,diGui(n));
return 0;
}
//递归函数
int diGui(int n){
int sum;
if(n==1)
sum=1;
else
sum=n*diGui(n-1);
return sum;
}
结果:
请输入你想要的递归数n=5
1!+2!+...5!=120
27.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
#include <stdio.h>
int isNumber(int n);
int niNumber(int n);
int main(){
int number;
printf("请输入数字number=");
scanf("%d",&number);
printf("输入的数字是%d位数\n",isNumber(number));
printf("逆序打印出的数字为%d",niNumber(number));
return 0;
}
//求它是几位数
int isNumber(int n){
int count=0;
while(n!=0){
n/=10;
count++;
}
return count;
}
//逆序打印数字
int niNumber(int n){
int m, sum=0;
while(n!=0){
m = n%10;
sum = sum*10 + m;
n /= 10;
}
return sum;
}
结果:
请输入5个字符 : abcde
相反顺序输出结果 : edcba
28.有5个人坐在一起,问第五个人多少岁?
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
#include <stdio.h>
int yearRecursion(int n);
//recursion:递归
int main(){
int n;
printf("有多少个人这样说n=");
scanf("%d",&n);
printf("第%d个人的岁数是%d",n,yearRecursion(n));
return 0;
}
//设置一个递归函数
int yearRecursion(int n){
int age;
if(n==1)
age=10;
else
age=yearRecursion(n-1)+2;
return age;
}
结果:
有多少个人这样说n=5
第5个人的岁数是18
29.给n位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
#include <stdio.h>
int isNumber(int n);
int niNumber(int n);
int main(){
int number;
printf("请输入数字number=");
scanf("%d",&number);
printf("输入的数字是%d位数\n",isNumber(number));
printf("逆序打印出的数字为%d",niNumber(number));
return 0;
}
//求它是几位数
int isNumber(int n){
int count=0;
while(n!=0){
n/=10;
count++;
}
return count;
}
//逆序打印数字
int niNumber(int n){
int m, sum=0;
while(n!=0){
m = n%10;
sum = sum*10 + m;
n /= 10;
}
return sum;
}
结果:
请输入数字number=123456
输入的数字是6位数
逆序打印出的数字为654321
30.回文数
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
程序分析:学会分解出每一位数。
#include <stdio.h>
void isPalindromeNumber(int n);
int main(){
int n;
printf("请输入一个数判断是否文回文数n=");
scanf("%d",&n);
isPalindromeNumber(n);
return 0;
}
//设置一个回文数函数
//palindrome:回文
void isPalindromeNumber(int n){
int number=n, newnumber=0;
while(number>0){
newnumber = newnumber*10 + number%10;
number /= 10;
}
if(n==newnumber)
printf("%d是回文数",n);
else
printf("%d不是回文数",n);
}
结果:
请输入一个数判断是否文回文数n=123456
123456不是回文数