入门级
被5整除问题
输入描述:
输入包括一个整数M(1≤M≤100,000)。
输出描述:
输出包括一行,如果M可以被5整除就输出YES,否则输出NO(结果大小写敏感)。
代码:
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); if(n%5==0) printf("YES\n"); else printf("NO\n"); return 0; }
讲解:
利用if else判断除于5 的余数是否为0
求两个数的较大值
写一个函数求两个整数的较大值
如:
输入:10 20
输出较大值:20
代码:
int get_max(int x, int y) { if(x > y) return x; else return y; } int main() { int num1 = 10; int num2 = 20; scanf("%d%d", &num1, &num2); //要求:完成get_max函数 int max = get_max(num1, num2); printf("max = %d\n", max); return 0; }
讲解:
解题思路:本题目主要是考察函数的声明定义,利用if else判断大小。
计算Y的值
描述
已知一个函数y=f(x),当x < 0时,y = 1;当x = 0时,y = 0;当x > 0时,y = -1。
输入描述:
一行,输入一个整数x。(-10000<x<10000)
输出描述:
一行,输出y的值。
代码:
#include <stdio.h> int main() { int x = 0; int y = 0; scanf("%d", &x); if(x<0) y = 1; else if(x == 0) y = 0; else y = -1; printf("%d\n", y); return 0; }
讲解:
本题目主要是考察利用代码实现函数功能,利用if else实现多级判断。
字符转ASCII码
描述
字符常量或字符变量表示的字符在内存中以ASCII码形式存储。输入一个字符,输出该字符相应的ASCII码。
输入描述:
一行,一个字符。
输出描述:
一行,输出输入字符对应的ASCII码。
代码:
#include <stdio.h> int main() { char ch = 0; scanf("%c", &ch); printf("%d\n",ch); return 0; }
讲解:
直接利用%d %c 的特性来实现转化 %c 来接收字符变量 %d 来输出整数变量即其对应的ASCII码。
判断整数奇偶性
描述
判断一个整数的奇偶性。从键盘任意输入一个整数(范围-231~231-1),编程判断它的奇偶性。
输入描述:
多组输入,每行输入包括一个整数。
输出描述:
针对每行输入,输出该数是奇数(Odd)还是偶数(Even)。
代码:
#include <stdio.h> int main() { int num = 0; while(scanf("%d", &num) != EOF) { if(num%2==1) printf("Odd\n"); else printf("Even\n"); } return 0; }
讲解:
注意实现多组输入(下面详解),利用if else实现判断奇偶。
补充:多组数据的输入方法(c语言实现)
EOF法
因为在线评测系统的输入数据存放在一个文件中,因此可以通过文件是否结束的方式判断输入的数据是否结束。
scanf在读取到文件结束符时,会返回标识EOF(end of life),EOF是一个预定义的常量,等于-1。通过判断scanf的返回值否为EOF决定是否退出循环。
while(scanf("%d", &num) != EOF) { }
排电梯
描述
电梯前排了很多人,前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。请帮助算还需要多少分钟才能乘电梯到达楼上。(假设最初电梯在1层)
输入描述:
输入包含一个整数n (0 ≤ n ≤ 109)
输出描述:
输出一个整数,即到达楼上需要的时间。
代码:
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); printf("%d\n", n/12*4+2); return 0; }
讲解:
n/12*4是需要等的时间 2是上楼的时间
逆序输出
描述
输入10个整数,要求按输入时的逆序把这10个数打印出来。逆序输出,就是按照输入相反的顺序打印这10个数。
输入描述:
一行,输入10个整数(范围-231~231-1),用空格分隔。
输出描述:
一行,逆序输出输入的10个整数,用空格分隔。
代码:
#include <stdio.h> int main() { int arr[10] = {0}; int i= 0 ; for(i=0; i<10; i++) { scanf("%d", &arr[i]); } for(i=9; i>=0; i--) { printf("%d ", arr[i]); } return 0; }
讲解:
利用for循环以及scanf接收10个整数放在一个数组中,在利用for循环以及printf打印数组,数组名从大到小打印。
计算体重指数
描述
问题:计算BMI指数(身体质量指数)。BMI指数(即身体质量指数,简称体质指数又称体重,英文为Body Mass Index,简称BMI),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。主要用于统计用途,当我们需要比较及分析一个人的体重对于不同高度的人所带来的健康影响时,BMI值是一个中立而可靠的指标。
数据范围:输入的数据满足 50≤n≤180
输入描述:
一行,两个整数,分别表示体重(公斤),身高(厘米),中间用一个空格分隔。
输出描述:
一行,BMI指数(保留两位小数)。
代码:
#include <stdio.h> int main() { int weight = 0; int height = 0; double bmi = 0.0; scanf("%d%d", &weight, &height); bmi = weight/((double)height*height/10000); printf("%.2lf\n", bmi); return 0; }
讲解:
按照公式——用体重公斤数除以身高米数平方得出的数字 求BMI 注意数字类型 double 和in t 计算时需要转换类型
基础级
找最大数
描述
获得4个最大数,编程找到最大的数。
输入描述:
一行,4个整数,用空格分开。
输出描述:
一行,一个整数,为输入的4个整数中最大的整数。
代码:
#include <stdio.h> int main() { int arr[4] = {0}; int i = 0; for(i=0; i<4; i++) { scanf("%d", &arr[i]); } //假设 int max = arr[0]; for(i=1; i<4; i++) { if(arr[i]> max) { max = arr[i]; } } printf("%d\n", max); return 0; }
讲解:
利用for循环以及scanf接收10个整数放在一个数组中,假设最大值是数组第一个数,进行遍历比较,利用if循环调整。
字母大小写转换
描述
字母大小写转换,有一个字符,判断它是否为大写字母,如果是,将它转换成小写字母;反之则转换为大写字母。
输入描述:
多组输入,每一行输入一个字母。
输出描述:
针对每组输入,输出单独占一行,输出字母的对应形式。
代码:
#include <stdio.h> int main() { int ch = 0; while((ch=getchar()) != EOF) { if(islower(ch)) { printf("%c\n", toupper(ch)); } else { printf("%c\n", tolower(ch)); } getchar(); } return 0; }
讲解:
注意多组输入变为字符时,利用getchar() 实现
C语言的islower函数是一个用来判断一个字符是否为小写字母的函数。
C语言的toupper函数是一个用来将一个小写字母转换为大写字母的函数。
C语言的tplower函数是一个用来将一个大写字母转换为小写字母的函数。
判断是不是字母
描述
判断输入的字符是不是字母,编程实现。
输入描述:
多组输入,每一行输入一个字符。
输出描述:
针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容详见输出样例。
代码:
#include <stdio.h> int main() { int ch = 0; while((ch=getchar()) != EOF) { //判断字母 //if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) if(isalpha(ch)) { printf("%c is an alphabet.\n", ch); } else { printf("%c is not an alphabet.\n", ch); } //清理掉\n getchar(); } return 0; }
讲解:
注:1.判断字母的两种方法
if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) 利用字母范围判断
if(isalpha(ch)) 利用函数 C语言的isalpha函数是一个用来判断一个字符是否为字母的函数。
2.利用getchar()函数清理掉换行符\n 清理掉输入的回车键
打印闰年
描述:打印1000年到2000年之间的闰年
代码:
#include <stdio.h> int main() { int year = 0; for(year=1000; year<=2000; year++) { //判断year是否为闰年 if(year%4==0) // 如果year能够被4整除,year可能为闰年 { if(year%100!=0) // 如果year不能内100整除,则一定是闰年 { printf("%d ", year); } } if(year%400 == 0) // 每400年再润一次 { printf("%d ", year); } } return 0; } // //介绍一下这种的简单写法 // int main() { int year = 0; for(year=1000; year<=2000; year++) { if(((year%4==0)&&(year%100!=0))||(year%400==0)) { printf("%d ", year); } } return 0; }
讲解:
思路: 要求1000年到2000年之间的闰年,只需要知道求解闰年的方法即可。
闰年的条件:如果N能够被4整除,并且不能被100整除,则是闰年
或者:N能被400整除,也是闰年
即:4年一润并且百年不润,每400年再润一次
最大公约数
描述:给定两个数,求这两个数的最大公约数
例如:
输入:20 40
输出:20
代码:
int main() { int a = 18; int b = 24; int c = 0; while(c=a%b) { a = b; b = c; } printf("%d\n", b); return 0; }
讲解:
最大公约数:即两个数据中公共约数的最大者。
求解的方式比较多,暴力穷举、辗转相除法、更相减损法、Stein算法算法
此处主要介绍:辗转相除法
思路: 例子:18和24的最大公约数 第一次:a = 18 b = 24 c = a%b = 18%24 = 18
循环中:a = 24 b=18 第二次:a = 24 b = 18 c = a%b = 24%18 = 6
循环中:a = 18 b = 6 第三次:a = 18 b = 6 c=a%b = 18%6 = 0
循环结束
此时b中的内容即为两个数中的最大公约数。
乘法口诀表
描述:在屏幕上输出9*9乘法口诀表
代码:
#include <stdio.h> int main() { int i = 0; //控制行数 for(i=1; i<=9; i++) { //打印每一行内容,每行有i个表达式 int j = 0; for(j=1; j<=i; j++) { printf("%d*%d=%2d ", i, j, i*j); } printf("\n"); } return 0; }
讲解:
思路: 两个循环进行控制 外层循环控制打印多少行
内部循环控制每行打印多少个表达式以及表达式内容, 比较简单,具体参考代码
分数求和
描述:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
代码:
#include <stdio.h> int main() { int i = 0; double sum = 0.0; int flag = 1; for(i=1; i<=100; i++) { sum += flag*1.0/i; flag = -flag; } printf("%lf\n", sum); return 0; }
讲解:
思路:
1. 从上述表达式可以分析出 a. 该表达式主要由100项,基数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0 / i, 注意此处不能使用1,否则结果全部为0
然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
然后将所有的项相加即可
未完待续……