函数(2)——4.兔子数列5.汉诺塔6.综合案例-RSA算法7.综合案例-体测成绩判定2021.11.16

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;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值