4.兔子数列(斐波那契数列)
一对兔子在出生两个月后,每个月能生出一对小兔子。现有一对刚出生的兔子,如果所有兔子都不死,那么一年后共有多少对兔子?
分析
n=1,兔子=1对;
n=2,兔子=1对;
n=3,兔子=2对;
......
f(n)=f(n-1)+f(n-2),n>1
#include<stdio.h>
int getNum(int n)//f(n)
{
if(n==1||n==2)
return 1;
return getNum(n-2)+getNum(n-1);//f(n-2)+f(n-1)
}
int main()
{
int getNum(int n);//声明
printf("f(1)=%d\n",getNum(1));//将函数作为实参调用
printf("f(2)=%d\n",getNum(2));
printf("f(3)=%d\n",getNum(3));
printf("f(4)=%d\n",getNum(4));
printf("f(5)=%d\n",getNum(5));
printf("f(12)=%d\n",getNum(12));
return 0;
}
5.汉诺塔
#include<stdio.h>
int getNum(int n)
{
if(n==1)//如果只有一个圆盘,则只移动一次
return 1;
else
return 2*getNum(n-1)+1;//当n>=2时,f(n)=2*f(n-1)+1
return 0;
}
int main()
{
int getNum(int n);//声明
int n=10,num;
num = getNum(n);
printf("汉诺塔中%d片圆盘共需移动%d次\n",n,num);
return 0;
}
此案例中n=10,如果n=64呢?这时我们要将int改为double,printf函数中第二个%d改为%e
6.综合案例-RSA算法
#include<stdio.h>
#include<stdlib.h>
int RSA(int baseNum,int key,int msg)//自定义的RSA函数
{
int RSAmsg=1;
key=key+1;
while(key!=1)
{
RSAmsg=RSAmsg*msg;
RSAmsg=RSAmsg%baseNum;
key--;
}
return RSAmsg;
}
int main()
{
int RSA(int baseNum,int key,int msg);//声明
int p,q,baseNum,Euler,r;
int keyE,keyD,m_msg,c_msg;
printf("请输入p、q:");
scanf("%d%d",&p,&q);//随机输入两个不相等的数p和q
baseNum=p*q;//计算p和q的乘积
Euler=(p-1)*(q-1);//求出此值,用来计算keyD
printf("请输入公钥(与%d互质):",Euler);
scanf("%d",&keyE);//输入公钥keyE
while(keyE<1||keyE>Euler)//keyE有大小范围的限制
{
printf("输入错误!\n请重新输入:");
scanf("%d",&keyE);
}
keyD=1;
while(((keyE*keyD)%Euler)!=1)//求私钥keyD
keyD++;
printf("私钥:%d\n",keyD);//打印菜单
printf("1.加密\n");
printf("2.解密\n");
printf("3.退出\n");
while(1)
{
printf("请选择要执行的操作:");
scanf("%d",&r);//输入选项1or2or3来执行不同操作
switch(r)
{
case 1://输入1进行加密
printf("请输入要加密的数据:");
scanf("%d",&m_msg);
c_msg=RSA(baseNum,keyE,m_msg);//调用RSA函数
printf("加密后的数据为:%d\n",c_msg);
break;
case 2://输入2进行解密
printf("请输入要解密的数据;");
scanf("%d",&c_msg);
m_msg=RSA(baseNum,keyD,c_msg);//调用RSA函数
printf("解密后的数据为:%d\n",m_msg);
break;
case 3://输入3退出程序
exit(0);
break;
default :
printf("选择有误\n");
break;
}
}
return 0;
}
while循环结构,switch选择结构
7.综合案例-体测成绩判定
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int sex = 0;
//体重指数
int countBMI(int sex)
{
float weight, height;
printf("请依次输入体重(kg)、身高(m):");
scanf("%f %f",&weight,&height);
float BMI=weight/(height*height);
int sco=0;
switch (sex)
{
case 0://男生
if(BMI>17.9&&BMI<23.9)
sco=100;
else if (BMI<=17.8||(BMI>24.0&&BMI<27.9))
sco=80;
else
sco=60;
break;
case 1://女生
if(BMI>17.2&&BMI<23.9)
sco=100;
else if(BMI<=17.1||(BMI>24.0&&BMI<27.9))
sco=80;
else
sco=60;
break;
default:
sco=0;
}
printf("体重指数为:%.2f,成绩为:%d\n",BMI,sco);
return sco;
}
//肺活量
int countFVC(int sex)
{
int FVC,sco;
printf("请输入肺活量(ml):");
scanf("%d",&FVC);
switch (sex)
{
case 0:
if(FVC>4800)
sco=100;
else if(FVC>4180&&FVC<=4800)
sco=80;
else if(FVC>3100&&FVC<=4180)
sco=60;
else
sco=30;
break;
case 1:
if(FVC>3400)
sco=100;
else if(FVC>3000&&FVC<=3400)
sco=80;
else if(FVC>2050&&FVC<=3000)
sco=60;
break;
default:
break;
}
return sco;
}
//引体向上
int countChinups()
{
if(sex==1)
{
printf("引体向上为男生特有项目!\n");
Sleep(2000);
exit(0);
}
int UPs=0,sco=0;
printf("引体向上计数为:");
scanf("%d",UPs);
if(UPs>19)
sco=100;
else if(UPs>15&&UPs<=19)
sco=80;
else if(UPs>10&&UPs<=15)
sco=60;
else
sco=30;
return sco;
}
//仰卧起坐
int countSitup()
{
if (sex==0)
{
printf("仰卧起坐为女生特有项目!\n");
Sleep(2000);
exit(0);
}
int UPs=0,sco=0;
printf("仰卧起坐计数为:");
scanf("%d",&UPs);
if(UPs>56)
sco=100;
else if(UPs>52&&UPs<=56)
sco=80;
else if(UPs>26&&UPs<=52)
sco=60;
else
sco=30;
return sco;
}
//总成绩
void getNum()
{
int BMI,FVC,Cups,Sups;
double num;
BMI = countBMI(sex);
FVC = countFVC(sex);
if(sex==0)
{
Cups=countChinups();
num=BMI*0.25+FVC*0.35+Cups*0.4;
}
else
{
Sups= countSitup();
num=BMI*0.25+FVC*0.35+Sups*0.4;
}
//判断成绩优劣
if(num>95)
printf("综合成绩为%.2f,优秀\n",num);
else if(num>80&&num<=95)
printf("综合成绩为%.2f,良好\n",num);
else if(num>60&&num<=80)
printf("综合成绩为%.2f,及格\n",num);
else
printf("综合成绩为%.2f,不及格\n",num);
}
//菜单
int menu()
{
int sec;
printf("功能菜单\n=============\n1.体重指数BMI\n2.肺活量FVC\n3.引体向上\n4.仰卧起坐\n5.总成绩\n0.退出\n=============\n请输入性别(男:0/女:1):");
scanf("%d",&sex);
while(sex!=0&&sex!=1)
{
printf("选择有误!\n请重新输入:");
scanf("%d",&sec);
}
printf("请输入要选择的功能:");
scanf("%d",&sec);
while(sec>5||sec<0)
{
printf("选择有误!\n请重新输入:");
scanf("%d",&sec);
}
return sec;
}
int main()
{
int countBMI(int sex);//声明
int countFVC(int sex)
int countChinups();
int countSitup();
void getNum();
int menu();
int sec=menu();//调用菜单函数,获取选择的编号
switch(sec)//功能调用
{
case 0:exit(0);break;
case 1:countBMI(sex);break;
case 2:countFVC(sex);break;
case 3:countChinups();break;
case 4:countSitup();break;
case 5:getNum();break;
default:break;
}
return 0;
}