lesson 3
(题目标题可以直接转题目链接)
描述
问题:计算BMI指数(身体质量指数)。BMI指数(即身体质量指数,简称体质指数又称体重,英文为Body Mass Index,简称BMI),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。主要用于统计用途,当我们需要比较及分析一个人的体重对于不同高度的人所带来的健康影响时,BMI值是一个中立而可靠的指标。
数据范围:输入的数据满足 50≤n≤180
输入描述:
一行,两个整数,分别表示体重(公斤),身高(厘米),中间用一个空格分隔。
输出描述:
一行,BMI指数(保留两位小数)。
示例1
输入:70 170
输出:24.22
参考代码:
#include <stdio.h>
int main() {
float bmi=0;
int w=0;
int h=0;
scanf("%d %d",&w, &h);
bmi=w/((h/100.0)*(h/100.0));//w和h都为整型元素/时结果只保留整数部分,但bmi为浮点型元素,
因此/一旁的100要加.0成为100.0这样/后得到的结果就为浮点型。
//法2可以用强制类型转换将w和h都转换为float浮点型计算
//eg:
//bmi = weight/((float)height*height/10000);
printf("%.2f",bmi);
return 0;
}
答案解析: 要得到浮点数,要进行浮点数除法,这里就得保证 / 两端的操作数至少有一个数是浮点数。
描述
根据给出的三角形3条边a, b, c,计算三角形的周长和面积。
数据范围: 0<a,b,c≤100000
输入描述:
一行,三角形3条边(能构成三角形),中间用一个空格隔开。
输出描述:
一行,三角形周长和面积(保留两位小数),中间用一个空格隔开,输出具体格式详见输出样例。
示例1
输入:3 3 3
输出:circumference=9.00 area=3.90
参考代码:
#include <stdio.h>
#include <math.h>
int main() {
float a=0;
float b=0;
float c=0;
float circumference=0;
float area=0;
scanf("%f%f%f",&a,&b,&c);
circumference=a+b+c;
area=sqrt( circumference/2*(circumference/2-a)*(circumference/2-b)*(circumference/2-c));
printf("circumference=%.2f area=%.2f",circumference,area);
return 0;
}
答案解析: 如果仅仅有3个边要计算周长简单,计算面积,这时得借助: 海伦公式 如果不知道海伦公式也没关系,查一下就知道了。
描述
给定一个球体的半径,计算其体积。其中球体体积公式为 V = 4/3*πr3,其中 π = 3.1415926。
数据范围:输入一个浮点值 0≤n≤15
输入描述:
一行,用浮点数表示的球体的半径。
输出描述:
一行,球体的体积,小数点后保留3位。
参考代码:
#include <stdio.h>
int main() {
double r=0;
double pai=3.1415926;
double v=0;
scanf("%lf",&r);
v=4/3.0*pai*r*r*r;
printf("%.3lf",v);
return 0;
}
答案解析: 注意,输入输出,照着公式写代码就行。 这个题目,如果使用 float 来求解,答案的精度是不够的,所以试错后,使用double类型合适。 这里要知道float和double为啥进度有区别,简单介绍一下。
描述
输入3科成绩,然后把三科成绩输出,成绩为整数形式。
数据范围: 0≤n≤100
输入描述:
一行,3科成绩,用空格分隔,范围(0~100)。
输出描述:
一行,把3科成绩显示出来,输出格式详见输出样例。
示例1
输入:60 80 90
输出:score1=60,score2=80,score3=90
参考代码:
#include <stdio.h>
int main() {
int a=0;
int b=0;
int c=0;
scanf("%d%d%d",&a, &b, &c);
printf("score1=%d,score2=%d,score3=%d",a,b,c);
return 0;
}
答案解析: 题目简单,按照格式输入输出就行了。
描述
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1*461 + 14*61 + 146*1
求出 5位数中的所有 Lily Number。
输入描述:
无
输出描述:
一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。
参考代码:
#include <stdio.h>
int main() {
int i=0;
int a=10;
for(i=10000;i<=99999;i++)
{ int sum=0;
for(a=10;a<=10000;a*=10)
{
sum+=(i/a)*(i%a);
}
if (sum==i) {
printf("%d ",i);
}
}
return 0;
}
答案解析: 分析题目后发现,lily数求和的每一项都是对同一个数(10/100/1000...)的取模或者整除取商。 这样的话,产生10,100,1000,10000 这些数字,分别对被判断的数字取模或者取商,然后乘起来,再 计算和,再判断就行。
描述
问题:KiKi今年5岁了,已经能够认识100以内的非负整数,并且并且能够进行 100 以内的非负整数的加法计算。不过,BoBo老师发现KiKi在进行大于等于100的正整数的计算时,规则如下:
1. 只保留该数的最后两位,例如:对KiKi来说1234等价于34;
2. 如果计算结果大于等于 100, 那么KIKI也仅保留计算结果的最后两位,如果此两位中十位为0,则只保留个位。
例如:45+80 = 25
要求给定非负整数 a和 b,模拟KiKi的运算规则计算出 a+b 的值。
数据范围: 0≤a,b≤2^31−1
输入描述:
一行,输入两个非负整数a和b,用一个空格分隔。(0 <= a,b<= 2^31-1)。
输出描述:
针对每组输入,输出按照KiKi的运算规则计算出 a+b 的值。
参考代码:
#include <stdio.h>
int main() {
int a=0;
int b=0;
scanf("%d%d",&a,&b);
printf("%d",(a+b)%100);
return 0;
}
附加题:(此题题运用到了函数)
写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c),返回a,b,c三数中大小位于中间的一个数。在main函数中调用该函数进行测试。
**输入格式要求:"%d%d%d" 提示信息:"请输入三个不同的整数:"
**输出格式要求:"中间的一个数为%d\n"
输入描述:
输入三个不同数传参给函数函数求三个数中的中间值
输出描述:
利用函数求出三个数的中间值后再返回,最后打印输出中间值
示例1:
输入:1 2 3
输出:2
参考代码:
#inclue <stdio.h>
//创建一个求中值的函数命名为mid
//声明函数
int mid(int a,int b,int c)
{
int i=a>b ? a:b;//求出a b中的最小值
int j=i>c ? c:i;//求出a b c中的最小值
if(i!=j)//此时i与最小值不相等:a b c中的最大值>i>j(i为中间值)
{
return i;
}
else
{//此时(i=j),推出最小值在a b中因为a b c为三个不同的值,且i为a b中最小值又等于a b c中最小值j
int i=a>b?a:b;//i为a b中的最大值
int j=i>c?c:i;//将i与c比较,因为最小值在a b中,所以i>c则中间值就是c否则c>i中间值就是i
return j;
}
}
int main()
{
int a=0;
int b=0;
int c=0;
scnaf("%d %d %d",&a, &b, &c);
int sum=mid(a,b,c);//调用函数把函数的返回值赋值给sum;
printf("%d",sum);
return 0;
}
如何理解函数:(仅限初识函数人群)
我(主函数int mian)是老板,它(定义的函数)是员工;
我给他一个固定的岗位,交代他办事,他办完事就回来。
至于办事之后的结果,看我要不要叫他报告给我。
代码中的a>b?a:b;(条件运算符)
程序分析:a和b比较如果a>b(程序中用的>号)为真(如3>2是个真实事实)则返回?号后面的值,
如果a>b为假(如2>3是个假的)则返回:号后面的值。
(懒人版: (a>b)?a:b:如果a大于b,则取a,否则取b。)
下一期 log in…………
文章主要参考比特就业课-鹏哥c语言训练营,文章内容及排版格式也参考比特课程的课件;
附加题为作者在生活中遇到的有意思的题,能增加大家的编码技巧以及拓展编码方法。