1. ASCII码排序

问题描述

  1. 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符
  2. Input
  3. 输入数据有多组,每组占一行,有三个字符组成,之间无空格
  4. Output
  5. 对于每组输入数据,输出一行,字符中间用一个空格分开
  6. Sample
  7. 输入:qwe
  8. asd
  9. zxc
  10. 输出:e w q
  11. a d s
  12. c x z

解题思路

  1. 字符,是以ascall码的形式储存的;跟整型数据是一样的;
  2. 字符之间可以进行运算,本质上是ascall码值的比较;
  3. 问题转化为三个数的排序问题
  4. 扩展:小写字母比大写字母的ascall值大32

代码

  1. # include <stdio.h>
  2. int main()
  3. {
  4. char a, b, c, t;
  5. while(scanf("%c%c%c", &a,&b,&c) == 3)
  6. {
  7. char temp = getchar(); //重点地方,getchar吸收回车符(getchar函数从控制台中读取字符,直到按回车结束)
  8. printf("%c\n", temp);
  9. if(a > b) {t = a;a = b;b = t;} //必有a <= b
  10. if(a > c) {t = a;a = c;c = t;} //必有a <= c
  11. if(b > c) {t = b;b = c;c = t;} //必有b <= c
  12. //a <= b <= c
  13. printf("%c %c %c\n", a, b, c);
  14. }
  15. return 0;
  16. }

重点

getchar函数

读取标准输入的一个字符,直到按回车(识别到'\n')为止

如果输入多个字符,其他字符会被放在缓存区,等待后续getchar调用

返回值:相应字符的ascall值

scanf返回值的问题

  1. 正确输入参数的个数
  2. EOF,输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车,就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。

2. 计算两点间的距离

问题描述

  1. 输入两点坐标(x1, y1), (x2, y2)
  2. input:
  3. 输入数据有多组,每组占一行,由4个实数组成,分别表示x1, y1, x2, y2,数据之间用空格隔开。
  4. output:
  5. 对于每组输入数据,输出一行,结果保留两位小数。

解题思路

  1. 欧式距离公式

代码

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. double x1, y1, x2, y2, dist;
  6. while(scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2) == 4)
  7. {
  8. getchar();
  9. dist = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
  10. printf("%.2f\n", dist);
  11. }
  12. return 0;
  13. }

重点

scanf的输入问题

  1. 输入,数据之间用空格隔开
  2. double类型输入必须使用%lf才能得到正确的值;输出可以使用%f

3. 计算球的体积

问题描述

  1. Problem Description
  2. 根据输入的半径值,计算球的体积。
  3. Input
  4. 输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。
  5. Output
  6. 输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。
  7. Sample Input
  8. 1
  9. 1.5
  10. Sample Output
  11. 4.189
  12. 14.137
  13. Hint
  14. #define PI 3.1415927

解题思路

  1. v = 3/4 * pi * pow(r, 3)

代码

  1. #include <stdio.h>
  2. #include <math.h>
  3. #define PI 3.1415927
  4. int main()
  5. {
  6. double r, v;
  7. while(scanf("%lf", &r) == 1)
  8. {
  9. v = 4/3.0 * PI * pow(r, 3); //乘法和除法优先级相同
  10. printf("%.3f\n", v);
  11. }
  12. return 0;
  13. }

重点

注意

必须是 4/3.0 → 1.33

如果是 4/3 → 1.00。最后答案也不对了

4. 求绝对值

问题描述

  1. Problem Description
  2. 求实数的绝对值。
  3. Input
  4. 输入数据有多组,每组占一行,每行包含一个实数。
  5. Output
  6. 对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
  7. Sample Input
  8. 123
  9. -234.00
  10. Sample Output
  11. 123.00
  12. 234.00

解题思路

  1. #include <math.h>中的fabs()函数

代码

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. double x;
  6. while(scanf("%lf", &x) == 1)
  7. {
  8. printf("%.2f\n", fabs(x));
  9. }
  10. return 0;
  11. }

重点

<stdlib.h>中的abs(x),x只能是长整型

5. 成绩转换

问题描述

  1. Problem Description
  2. 输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
  3. 90~100A;
  4. 80~89B;
  5. 70~79C;
  6. 60~69D;
  7. 0~59E;
  8. Input
  9. 输入数据有多组,每组占一行,由一个整数组成。
  10. Output
  11. 对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
  12. Sample Input
  13. 56
  14. 67
  15. 100
  16. 123
  17. Sample Output
  18. E
  19. D
  20. A
  21. Score is error!

解题思路

  1. 可以用判断if-else if-结构来做;
  2. 也可以用switchcase来做

代码

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int score;
  5. while(scanf("%d", &score) == 1)
  6. {
  7. if(score < 0 || score > 100) printf("Score is error!\n");
  8. else if(score >= 90) printf("A\n");
  9. else if(score >= 80) printf("B\n");
  10. else if(score >= 70) printf("C\n");
  11. else if(score >= 60) printf("D\n");
  12. else if(score >= 0) printf("E\n");
  13. }
  14. return 0;
  15. }

重点

switch case语句

  1. switch(expression)
  2. {
  3. case 1: printf();break; //expression == 1
  4. case 2:
  5. default: printf();
  6. }

6. 第几天

问题描述

  1. Problem Description
  2. 给定一个日期,输出这个日期是该年的第几天。
  3. Input
  4. 输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
  5. Output
  6. 对于每组输入数据,输出一行,表示该日期是该年的第几天。
  7. Sample Input
  8. 1985/1/20
  9. 2006/3/12
  10. Sample Output
  11. 20
  12. 71

解题思路

  1. 使用数组保存每个月的天数
  2. 判断闰年/平年,改变2月天数

代码

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a,b,c;
  5. int d[13]={31,28,31,30,31,30,31,31,30,31,30,31};
  6. while(~scanf("%d/%d/%d",&a,&b,&c))
  7. {
  8. int num=0;
  9. for(int i=0;i<b-1;i++)
  10. num+=d[i];
  11. if(a%400==0||(a%4==0&&a%100!=0))
  12. {
  13. if(b>2)
  14. num+=c+1;
  15. else
  16. num+=c;
  17. }
  18. else
  19. num+=c;
  20. printf("%d\n",num);
  21. }
  22. return 0;
  23. }

重点

scanf取反

可以经常在ACM代码中看到 while(~scanf("%d",&n)){ } 这样的代码,意思是在读到输入结尾时循环也结束。

一般在读到输入流结尾时,scanf返回的是EOF。

EOF是在头文件stdio.h中定义的常量,一般为-1。

-1 的原码是10000001,反码是1111110,补码是11111111

~EOF则是对EOF进行按位取反操作,则为00000000。所以while条件不满足,循环结束。

7. 求n个数中奇数的乘积

问题描述

  1. Problem Description
  2. 给你n个整数,求他们中所有奇数的乘积。
  3. Input
  4. 输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。
  5. Output
  6. 输出每组数中的所有奇数的乘积,对于测试实例,输出一行。
  7. Sample Input
  8. 3 1 2 3
  9. 4 2 3 4 5
  10. Sample Output
  11. 3
  12. 15

解题思路

  1. 两个while解决输入n个数的控制问题
  2. 奇数:除以2的余数为1

代码

  1. #include <stdio.h>
  2. #define maxn 100000
  3. int main()
  4. {
  5. int n, x;
  6. int i = 0;
  7. int num[maxn];
  8. while(scanf("%d", &n) != EOF)
  9. {
  10. int ans = 1;
  11. while(n--){
  12. scanf("%d", &x);
  13. if(x%2 == 1) ans *= x;
  14. }
  15. printf("%d\n", ans);
  16. }
  17. return 0;
  18. }

重点

详细读题目,n个数的输入,明确了输入个数。

8. 平方和与立方和

问题描述

  1. Problem Description
  2. 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
  3. Input
  4. 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数mn组成。
  5. Output
  6. 对于每组输入数据,输出一行,应包括两个整数xy,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
  7. 你可以认为32位整数足以保存结果。
  8. Sample Input
  9. 1 3
  10. 2 5
  11. Sample Output
  12. 4 28
  13. 20 152

解题思路

  1. 偶数 %2 == 0pow(偶数,3)
  2. 奇数 %2 == 1pow(奇数,3)

代码

  1. # include <stdio.h>
  2. # include <math.h>
  3. int main()
  4. {
  5. int x, y;
  6. //int even_sum = 0;
  7. //int odd_sum = 0;
  8. while(~scanf("%d %d", &x, &y)){
  9. int even_sum = 0;
  10. int odd_sum = 0;
  11. if(x > y){
  12. int temp;
  13. temp = x;
  14. x = y;
  15. y = temp;
  16. }
  17. for(;x <= y; x++)
  18. {
  19. if(x%2 == 0) even_sum += pow(x, 2);
  20. else odd_sum += floor(pow(x, 3) + 0.5);
  21. }
  22. printf("%d %d\n", even_sum, odd_sum);
  23. }
  24. return 0;
  25. }

重点

考虑输入大小问题

pow(5, 3)在整型int输出使会舍入为124,不会返回125

**更安全的写法 floor(pow(x, 3) + 0.5) **

9. 数值统计

问题描述

  1. Problem Description
  2. 统计给定的n个数中,负数、零和正数的个数。
  3. Input
  4. 输入数据有多组,每组占一行,每行的第一个数是整数nn<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。
  5. Output
  6. 对于每组输入数据,输出一行a,bc,分别表示给定的数据中负数、零和正数的个数。
  7. Sample Input
  8. 6 0 1 2 3 -1 0
  9. 5 1 2 3 4 0.5
  10. 0
  11. Sample Output
  12. 1 2 3
  13. 0 0 5

解题思路

  1. 注意条件 n=0break

代码

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n;
  5. double x;
  6. while(scanf("%d", &n) != EOF){
  7. int num_negative = 0;
  8. int num_zero = 0;
  9. int num_positive = 0;
  10. if(n == 0) break;
  11. while(n--)
  12. {
  13. scanf("%lf", &x);
  14. if(x > 0) num_positive += 1;
  15. else if(x < 0) num_negative += 1;
  16. else num_zero += 1;
  17. }
  18. printf("%d %d %d\n", num_negative, num_zero, num_positive);
  19. }
  20. return 0;
  21. }

重点

仔细看题

10. 求数列的和

问题描述

  1. Problem Description
  2. 数列的定义如下:
  3. 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
  4. Input
  5. 输入数据有多组,每组占一行,由两个整数nn<10000)和m(m<1000)组成,nm的含义如前所述。
  6. Output
  7. 对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
  8. Sample Input
  9. 81 4
  10. 2 2
  11. Sample Output
  12. 94.73
  13. 3.41

解题思路

  1. 不想写了,想什么写什么

代码

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. double n;
  6. while(scanf("%lf", &n) != EOF)
  7. {
  8. double ans = 0.0;
  9. int m;
  10. scanf("%d", &m);
  11. while(m--){
  12. ans += n;
  13. n = sqrt(n);
  14. }
  15. printf("%.2f\n", ans);
  16. }
  17. return 0;
  18. }

重点

同上

杭电OJ第11页2000-2009道题(C语言)的更多相关文章

  1. 杭电OJ第11页2010-2019道题(C语言)

    2010. 水仙花数 问题描述 Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位 ...

  2. 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

    今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...

  3. 爬取杭电oj所有题目

    杭电oj并没有反爬 所以直接爬就好了 直接贴源码(参数可改,循环次数可改,存储路径可改) import requests from bs4 import BeautifulSoup import ti ...

  4. C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~

    暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...

  5. 杭电oj 2095 & 异或^符号在C/C++中的使用

    异或^符号,在平时的学习时可能遇到的不多,不过有时使用得当可以发挥意想不到的结果. 值得注意的是,异或运算是建立在二进制基础上的,所有运算过程都是按位异或(即相同为0,不同为1,也称模二加),得到最终 ...

  6. 用python爬取杭电oj的数据

    暑假集训主要是在杭电oj上面刷题,白天与算法作斗争,晚上望干点自己喜欢的事情! 首先,确定要爬取哪些数据: 如上图所示,题目ID,名称,accepted,submissions,都很有用. 查看源代码 ...

  7. 杭电oj 4004---The Frog Games java解法

    import java.util.Arrays; import java.util.Scanner; //杭电oj 4004 //解题思路:利用二分法查找,即先选取跳跃距离的区间,从最大到最小, // ...

  8. 杭电oj————2057(java)

    question:A+ B again 思路:额,没啥思路/捂脸,用java的long包里的方法,很简单,只是有几次WA,有几点要注意一下 注意:如果数字有加号要删除掉,这里用到了正则表达式“\\+” ...

  9. 『ACM C++』HDU杭电OJ | 1418 - 抱歉 (拓扑学:多面体欧拉定理引申)

    呕,大一下学期的第一周结束啦,一周过的挺快也挺多出乎意料的事情的~ 随之而来各种各样的任务也来了,嘛毕竟是大学嘛,有点上进心的人多多少少都会接到不少任务的,忙也正常啦~端正心态 开心面对就好啦~ 今天 ...

随机推荐

  1. proc demo

    源文件test.pc #include <stdio.h> #include <string.h> #include <stdlib.h> #include &qu ...

  2. 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)

    传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...

  3. 2018.08.21 NOIP模拟 unlock(模拟+找规律)

    unlock 描述 经济危机席卷全球,L国也收到冲击,大量人员失业. 然而,作为L国的风云人物,X找到了自己的新工作.从下周开始,X将成为一个酒店的助理锁匠,当然,他得先向部门领导展示他的开锁能力. ...

  4. c语言学生信息管理系统-学习结构体

    #include<stdio.h> #include<stdlib.h> //结构体可以存放的学生信息最大个数,不可变变量 ; //学生信息结构体数组,最多可以存放100个学生 ...

  5. 命令行生成war包

    1.找到自己的代码位置 2.进入cmd界面 3.进入对应的目录 4.执行命令 5.就会开始自动打包 6.在文件夹下生成对应的war包

  6. Android继承BaseAdapter时要重写的函数的说明

    原文来自:http://www.2cto.com/kf/201405/299601.html,我自己做了一些修改 Android中继承BaseAdapter后需要重写四个函数,但一般还要写一个构造函数 ...

  7. java编程规范-阿里

  8. 百度Webuploader 大文件分片上传(.net接收)

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  9. 解决 multiple definition of

    总结了解决multiple definition of的方法: 问题原因:    当多个文件包含同一个头文件时,并且你的.H里面没有加上条件编译#ifndef TEST_H#define TEST_H ...

  10. 论文笔记(4)-Deep Boltzmann Machines

    Deep Boltzmann Machines是hinton的学生写的,是在RBM基础上新提出的模型,首先看一下RBM与BM的区别 很明显可以看出BM是在隐含层各个节点以及输入层各个节点都是相互关联的 ...