今天的学习问题是
【抓交通肇事犯】
【问题描述】
/*
一辆卡车违反交通规则,撞人后逃逸。现场有三个人目击事件,但都没有记住车号,只记得车号的一些特征。甲说:牌照的前两位数是相同的;乙说:牌照的后两位是相同的,但与前两位不同;丙说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
*/
【问题分析】
按照题目的要求,是要寻找一个前两位数相同、后两位数相同且相互间又不相同的4位整数,然后判断这个整数是否是另一个整数的平方。即求一个满足以上条件的四位数。
【算法设计】
对于这类问题,首先想到穷举法,于是我们先找满足前两个条件的整数,然后让其开平方运算,看是否能满足第二个条件。
1)车牌是四位,开平方的话应该是比31大一点,而比32小一点,于是我们可以用循环的方式让其验证条件二。
2)我们首先穷举所有满足条件一的数字,即aabb,a!=b。
【程序】
#include<stdio.h>
int main()
{
int A,B,ID,num; //定义了前两位数A、后两位数B以及车牌号ID
for(A=0;A<10;A++)
for(B=0;B<10;B++)
{
if(A!=B) //限制前后数字不同
{
ID=1000*A+100*A+10*B+B; //求出车牌号
for(num=31;num<100;num++)
{
if(ID==num*num)
printf("%d",ID);
}
}
}
}
结果是:7744
【兔子产子问题】
【问题描述】
/*
有一对兔子,从出生的第3个月起,每月都生一对兔子。小兔子长到3月后每月又生一对兔子,假设所有兔子不死,问30个月内,每月兔子个数是多少?
*/
【问题分析】
针对这个问题,我画了一个月份与兔子数目对照表:
我发现每个月的兔子总数满足斐波那契数列的特征,于是我将这个问题看为求斐波那契数列的问题,它的规律是前两个数字之和等于第三个数,即n+1=n+n-1。
【算法设计】
给出第一个与第二个数,利用递归的方式计算出30个月内每个月兔子的对数。
第一个数为1,第二个数为1。
【程序】
#include<stdio.h>
int rabbish(int x)
{
int num=0,flag = 1,flag1 = 1;
int i;
for (i=3;i<=x;i++)
{
num = flag + flag1;
flag=flag1;
flag1=num;
}
return num;
}
int main()
{
int month,num2;
printf("请输入月份");
scanf("%d",&month);
num2 = rabbish(month);
printf("第%d个月兔子的对数为%d",month,num2);
}
这个程序可以算出每个月的兔子对数。
下面这个程序可以算出多少个月以内所有月份兔子的个数。
#include<stdio.h>
int rabbish(int x)
{
int num=0,flag = 1,flag1 = 1;
int i;
for (i=3;i<=x;i++)
{
num = flag + flag1;
flag=flag1;
flag1=num;
printf("%10d",num);
}
return num;
}
int main()
{
int month,num2;
printf("请输入月份");
scanf("%d",&month);
printf("1 1");
num2 = rabbish(month);
}
结果是: