针对C语言入门OJ题(牛客网)
(入门)BC52-衡量人体胖瘦程度_牛客题霸_牛客网 (nowcoder.com)
解析:
浮点数除法要保证除号的两端至少有一个浮点数。
参考代码:
//代码一 #include <stdio.h> int main() { float weight = 0.0; float hight = 0.0; while(scanf("%f %f", &weight, &hight) != EOF) { float bmi = weight/(hight*hight/100/100); if(bmi < 18.5) { printf("Underweight\n"); } else if(bmi>=18.5 && bmi <= 23.9) { printf("Normal\n"); } else if(bmi > 23.9 && bmi <= 27.9) { printf("Overweight\n"); } else { printf("Obese\n"); } } return 0; }
//代码二 #include <stdio.h> int main() { int weight = 0; int hight = 0; while(~scanf("%d %d", &weight, &hight)) { float bmi = weight/((hight/100.0)*(hight/100.0)); if(bmi < 18.5) { printf("Underweight\n"); } else if(bmi>=18.5 && bmi <= 23.9) { printf("Normal\n"); } else if(bmi > 23.9 && bmi <= 27.9) { printf("Overweight\n"); } else { printf("Obese\n"); } } return 0; }
(简单)BC53-计算一元二次方程_牛客题霸_牛客网 (nowcoder.com)
解析:
- 需要根据题目不同的限制条件给出相应的计算结果。
- 注意小点数后位数题目有限制。
- 注意使用了sqrt()函数,需要引用math.h头文件。
参考代码:
#include <stdio.h> #include <math.h> int main() { float a = 0.0; float b = 0.0; float c = 0.0; while(scanf("%f %f %f", &a, &b, &c) != EOF) { if(a != 0) { float disc = b*b-4*a*c;//在数学中,△=b^2-4*a*c if(disc>0.0) { //有两个不相等的实数根 printf("x1=%.2f;x2=%.2f\n", (-b-sqrt(disc))/(2*a), (-b+sqrt(disc))/(2*a) ); } else if(disc < 0.0) { //有两个虚根 //写法1 printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi\n", (-b)/(2*a), sqrt(-disc)/(2*a), (-b)/(2*a), sqrt(-disc)/(2*a)); //写法2 //float real = (-b)/(2*a); //float image = sqrt(-disc)/(2*a); //printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi\n", // real, image, real, image); } else { //有两个相等的实数根 printf("x1=x2=%.2f\n", (-b)/(2*a)); } } else { printf("Not quadratic equation\n"); } } return 0; }
(简单)BC54-获得月份天数_牛客题霸_牛客网 (nowcoder.com)
解析:
判断闰年,如果是闰年, 2 月多一天,其他都正常。
参考代码:
#include <stdio.h> int main() { int y = 0; int m = 0; int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; while(scanf("%d%d", &y, &m) != EOF) { int day = days[m-1]; if((y%4==0 && y%100!=0) || (y%400==0)) { if(m == 2) day += 1; } printf("%d\n", day); } return 0; }
(简单)BC55-简单计算器_牛客题霸_牛客网 (nowcoder.com)
解析:
- 按照格式接收,按照要求编写代码就行。
- 这个题使用float精度不满足要求。
参考代码:
#include <stdio.h> //精度尽量保持高 //这道题如果使用float,精度无法满足要求 int main() { double n1 = 0.0; double n2 = 0.0; char op = 0;//操作符 while(scanf("%lf%c%lf", &n1, &op, &n2) != EOF) { switch(op) { case '+': printf("%.4lf+%.4lf=%.4lf", n1, n2, n1+n2); break; case '-': printf("%.4lf-%.4lf=%.4lf", n1, n2, n1-n2); break; case '*': printf("%.4lf*%.4lf=%.4lf", n1, n2, n1*n2); break; case '/': if(n2 == 0.0) printf("Wrong!Division by zero!\n"); else printf("%.4lf/%.4lf=%.4lf", n1, n2, n1/n2); break; default: printf("Invalid operation!\n"); break; } } return 0; }
(入门)BC56-线段图案_牛客题霸_牛客网 (nowcoder.com)
解析:
每次打印一个 * ,按照输入的个数打印后换行就行。
参考代码:
#include <stdio.h> int main() { int n = 0; while(scanf("%d", &n)!=EOF) { int i = 0; for(i=0; i<n; i++) { printf("*"); } printf("\n"); } return 0; }
(简单)BC57-正方形图案_牛客题霸_牛客网 (nowcoder.com)
解析:
每组是由 n 组 *+ 空格组成。
参考代码:
#include <stdio.h> int main() { int n = 0; while(scanf("%d", &n) != EOF) { int i = 0; //确定行数 for(i=0; i<n; i++) { int j = 0; //每一行的打印,打印n组*+空格 for(j=0; j<n; j++) { printf("* "); } printf("\n"); } } return 0; }
(简单)BC58-直角三角形图案_牛客题霸_牛客网 (nowcoder.com)
解析:
要计算清楚每一行的输出。
参考代码:
#include<stdio.h> int main() { int n = 0; while(scanf("%d", &n) != EOF) { int i = 0; //控制行数 for(i=1; i<=n; i++) { //打印一行 int j = 0; for(j=1; j<=i; j++) { printf("* "); } printf("\n"); } } return 0; }
(简单)BC59-翻转直角三角形图案_牛客题霸_牛客网 (nowcoder.com)
解析:
每两个 * 中间有空格,要注意控制好一行输出的内容。
参考代码:
#include <stdio.h> int main() { int n = 0; while(scanf("%d", &n) != EOF) { int i = 0; //行数 for(i=n; i>=1; i--) { //打印一行 int j = 0; for(j=i; j>=1; j--) { printf("* ");//这里注意空格 } printf("\n"); } } return 0; }
(简单)BC60-带空格直角三角形图案_牛客题霸_牛客网 (nowcoder.com)
解析:
第二种写法中,在红色三角形范围内的每个坐标上,横纵坐标之和小于n-1。
参考代码:
//代码1-常规写法 #include <stdio.h> int main() { int n = 0; while(scanf("%d", &n) != EOF) { int i = 0; //行数控制 for(i=0; i<n; i++) { //打印空格 int j = 0; for(j=0; j<n-1-i; j++) { printf(" "); } //打印* for(j=0; j<=i; j++) { printf("* "); } printf("\n"); } } return 0; }
//代码2 #include <stdio.h> int main() { int n = 0; while(scanf("%d", &n) != EOF) { int i = 0; int j = 0; //行数 for(i=0; i<n; i++) { //一行 for(j=0; j<n; j++) { //行和列的和 //这里可以将行数和列数标出来,利于看明白 if(i+j<n-1) { printf(" "); } else { printf("* "); } } printf("\n"); } } return 0; }
(简单)BC61-金字塔图案_牛客题霸_牛客网 (nowcoder.com)
解析:
每一行的前边是空格,后边是 * + 空格,控制好个数就行。
参考代码:
#include <stdio.h> int main() { int n = 0; while(scanf("%d", &n) != EOF) { int i = 0; for(i=0; i<n; i++) { //一行 int j = 0; //空格 for(j=0; j<n-1-i; j++) { printf(" "); } //* for(j=0; j<=i; j++) { printf("* "); } printf("\n"); } } return 0; }