1.猴子吃桃问题
猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
分析:反向分析 前天桃子的数量=(当天桃子数量+1)*2
源代码:
#include<stdio.h>
int main(){
int i,S;
S=1;
for(i=9;i>=1;i--){
S=(S+1)*2;
}
printf("第一天摘了%d个桃子\n",S);
return 0;
}
【递归】
#include<stdio.h>
int f(int n){
int i=0;
if(n==10){
i=1;
}
else
{
i=(f(n+1)+1)*2;
}
return i;
}
int main(){
printf("第一天摘了%d个桃子。\n",f(1));
return 0;
}
2.乒乓球比赛抽签问题
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
分析:
循环依次比较,两两比较,判断参赛队员是否重复,因此需要两个if 在循环中间判断
源代码:
#include<stdio.h>
int main()
{
int i,j,k; //i是a的对手,j是b的对手,k是c的对手
for (i = 'x';i <= 'z'; i++)
{
for (j = 'X';j <= 'z'; j++)
{
if (i != j)//避免重复比赛
{
for (k = 'x'; k <= 'z'; k++)
{
if (i != k&&j!=k)//避免重复比赛
{
if (i != 'x' && k != 'x' && k != 'z')
{
printf(" a对%c\n b对%c\n c对%c", i, j, k);
}
}
}
}
}
}
return 0;
}
3.打印菱形图案
打印出如下图案(菱形)
分析:
每行每行的进行循环输出
源代码:
#include <stdio.h>
int main (void)
{
int i, j, k;
for (i = 1; i <= 4; i++) //先打印前4行
{
for (j = 1; j <= 5 - i; j++) //每一行先打印需要打印的空格,空格数为(5 - 行号),譬如第1行,需要打5-1个空格,第2行需要打5-2个空格
printf(" ");
for (k = 1; k <= 2 * i-1; k++) //打完空格打‘*',每行需要打印2倍行号-1个,譬如第1行打印2*1 - 1个,第2行打印2*2 - 1=3个
printf("*");
printf("\n");
}
for (i = 1; i <= 3; i++) //然后打印后面三行,行号从1开始计算
{
for (j = 1; j <= i+1; j++) //每行打印空格数为行号数,譬如第1行打印1+1个,第2行打印2+1个
printf(" ");
for (k = 1; k <= 7 - 2 * i; k++) //每行打印7-2*i个'*',譬如第1行打印7-2*1=5个,第2行打印7-2*2=3个
printf("*");
printf("\n");
}
}
4.分数数列求和
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
分析:
for循环,s=s+a/b;
使用temp作为中间数据进行转换
源代码:
#include<stdio.h>
int main(){
int i;
float temp,s=0,a=2,b=1;//注意分子分母以及和的形式
for(i=1;i<=20;i++){
s=s+a/b;
temp=a;
a=a+b;
b=temp;
}
printf("前二十项和为%9.6f\n",s);
return 0;
}
5.求1+2!+3!+...+20!的和
求1+2!+3!+...+20!的和
分析:
for循环
sn+1=sn+n*(n+1)
源代码:
#include<stdio.h>
int main(){
float n,s=0,t=1;
for(n=1;n<=20;n++){
t*=n;
s+=t;
}
printf("1+2!+3!+...+20!=%e\n",s);
return 0;
}
6.利用递归方法求5!
利用递归方法求5!。
分析:
f(n)=n*f(n-1)
源代码:
#include <stdio.h>
int f(int n)
{
if (n == 1)
{
return 1;
}
else
{
return n * f(n - 1);
}
}
int main()
{
int f(int n);//调用函数
int m = 5;
printf("5!=%d\n", f(m));
return 0;
}
7.将输入字符以相反顺序打印
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
分析:
字符用getchar输入,putchar输出(入栈出栈)
递归函数,反复调用
源代码:
#include<stdio.h>
void f(int n){
char c;
if(n==1){
c = getchar();//入栈
putchar(c);//出栈
}
else
{
c = getchar();
f(n-1);
putchar(c);
}
}
int main(){
void f(int n);
f(5);
return 0;
}
8.岁数问题
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
分析:
递归:一直加2
源代码:
#include<stdio.h>
int age(int n){//递归函数
int a=0;
if(n==1)
a=10;
else
a=age(n-1)+2;
return a;//返回a的值
}
int main(){
printf("第五个人%d岁\n",age(5));
return 0;
}
一般:
#include <stdio.h>
int main()
{
int i=1,sum=10;
for(i=1;i<5;i++)
{
sum+=2;
}
printf("第五个是%d岁",sum);
return 0;
}
9.求解正整数问题
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
分析:
运用除和商得各位上数字
源代码:
#include<stdio.h>
int main(){
long a,b,c,d,e,x;
scanf("%ld",&x);
a=x/10000;
b=x%10000/1000;
c=x%1000/100;
d=x%100/10;//分解出十位
e=x%10;
if(a!=0) printf("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a);
else if(b!=0) printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b);
else if(c!=0) printf("there are 3, %ld %ld %ld\n",e,d,c);
else if(d!=0) printf("there are 2, %ld %ld\n",e,d);
else if(e!=0) printf("there are 1, %ld\n",e);
return 0;
}
利用字符串,根据字符串的库函数求出位数,自定义函数,实现逆序。【进阶】
#include <stdio.h>
#include <string.h>
// 定义一个字符串数组,用来存放得到的整数
static char str[5];
//自定义函数,实现逆序
void Reverse(int n) {
while (n > 0) {
printf("%c", str[--n]);
}
}
int main() {
printf("请输入一个正整数:");
scanf("%s", str);
// 利用库函数求字符串长度,即为所求整数的位数
printf("这是一个%lu位数\n", strlen(str));
printf("逆序为:");
// 调用自定义逆序函数
Reverse(strlen(str));
return 0;
}
10.判断回文数
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
分析:
与【9】类似
源代码:
#include<stdio.h>
int main(){
long ge,shi,qian,wan,x;
scanf("%ld",&x);
wan=x/10000;
qian=x%10000/1000;
shi=x%100/10;
ge=x%10;
if(ge==wan&&shi==qian)
printf("this number is a huiwen.\n");
else
printf("this number is not a huiwen.\n");
return 0;
}
【字符串】 利用字符串,将这5位数作为字符串输入到一个字符数组中,利用数组下标找到各个数字进行比较,判断是否为回文数字
#include <stdio.h>
#include<string.h>
int main()
{
char str[5];
printf("请输入五位数:");
scanf("%s", str);
if (str[0] == str[4] && str[1] == str[3])
printf("这是一个回文数。\n");
else
printf("这不是回文数。\n");
return 0;
}