https://www.baidu.com/s?wd=刷算法常用的函数
=============
- 位运算相关技巧知识点
- if else记得用三木运算符替换 加减的初试化为0,乘除的初始化为1;注意给的数据要判断大小顺序
- n--替换循环
- 要循环的命令写在for条件中第三个位置。 要初始化的命令写在for条件第一个位置。
- 要循环的命令写在for条件中第三个位置。 要初始化的命令写在for条件第一个位置。
- 说了是正整数 的直接用 unsigned int 替换掉int
- 交换两个数据的方法 C语言交换两个变量数值的几种方法 - ljx_5489464的博客 - CSDN博客
https://blog.csdn.net/ljx_5489464/article/details/50042571
用c语言实现两数交换的四种方法 - Bit Up - CSDN博客
https://blog.csdn.net/qq_41209741/article/details/82261889
其中最后一种位操作没看哦,加油!
位运算——强大得令人害怕 - Daioo 随笔 - CSDN博客
https://blog.csdn.net/deaidai/article/details/78167367
- 1、隐式转换
C在以下四种情况下会进行隐式转换:
1、算术运算式中,低类型能够转换为高类型。
2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
2、算数运算的隐式转换
算数运算中,首先有如下类型转换规则:
1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。
2、short型转换为int型(同属于整型) 。
3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。
其次,有下面的规则。
当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作,转换规则是由低级向高级转换。转换规则如下图所示:
=============
1.cstdio是面向“文件”的,或者不强调文件和非文件流的区别,默认流就是可以关联外部文件,至于文件的外延是啥就不管,扔给宿主环境了。从std::FILE这个名字以及printf/scanf接口描述基于fprintf/fscanf上就可以看出来。
iostream头只是包含了一坨东西,封装标准输入输出流,和文件流(在<fstream>)不通用。
2.cstdio不知道iostream,而iostream知道cstdio并且默认同步,此外提供有限的接口摆脱关系(sync_with_stdio)。因为这个接口约束,iostream要脱离cstdio(的实现)是不太可能的。
3.cstdio有orientation的概念;iostream是否wide是直接写死在静态类型的模板参数里的,并且底层的流不只支持char和wchar_t字符类型。
4.iostream底层公开了相对完整的缓冲接口(如std::basic_filebuf),可以自行扩展;cstdio只能笼统地设置缓冲模式和提供提供区的接口,但多了行缓冲的概念(_IOLBF)。
5.iostream和std::locale交互。C标准库的<locale.h>(对应C++的<clocale>)提供locale-specific behavior,和cstdio不直接关联。两者不是一回事。
因为这个原因,iostream能直接编解码字符串,而cstdio不能处理和wide-oriented无关的编码,需要<wchar.h>(对应C++的<cwchar>)或C11的<uchar.h>的例程显式调用。
6.iostream体系提供了基于字符串提供了“内存流”(主要是std::stringstream),而cstdio这部分一般只是内部实现,如果需要得自己造。
7.iostream底层通过继承和重写protected虚函数提供实现。cstdio这部分是内部实现,不提供与之对应的扩展功能。
8.两者都实现了流的状态,但不尽相同。iostream显式区分bad和fail,但cstdio没有。
9.iostream提供特定的打开模式的组合,而cstdio使用字符串参数。前者无法直接扩展;后者解析较低效,虽然不需要修改类型就可扩展但也存在实现的运行时兼容性问题。
10.除了检查流的状态,iostream处理错误可选使用异常。cstdio处理错误依赖返回值和流状态。
11.iostream的格式输入输出基于重载,静态分派且类型安全,可以实现得更高效;cstdio的格式输入输出使用的是领域特定语言,需要运行时解析,通常比较低效,且实现的运行时兼容问题修复较困难。
但后者同时提供运行时配置可修改的格式的功能,而前者没有。
功能:当n为0时中止循环
这里要先说一下逗号表达式:逗号表达式的值是逗号后面的那个数。例如x=(5,6),则x=6。
while(scanf("%d",&n),n)括号里的语句其实就是个逗号表达式,它的返回值是n的值,所以这个语句就相当于while(n),n=0时跳出循环,写成这样是为了输入。
如果是while(scanf("%d%d",&n,&m,),n,m),那么就相当于while(m)。
2、while(scanf("%d",&n)!=EOF)和while(~scanf("%d",&n))
功能:当读到文件结尾时中止循环
scanf语句的返回值为成功赋值的个数,例如scanf("%d %d",&a,&b),如果a、b均赋值成功返回值为2,只是a赋值成功返回1,a、b都不成功返回0,出错的时候返回EOF。
~是按位取反,scanf语句如果没有输入值就是返回-1,按位取反结果为0。
注意:这两种方法在输入字母的时候会变成死循环,而scanf("%d %d",&a,&b)==2不会。windows下可通过按“Ctrl +Z”、linux下可通过“Ctrl + D”来来达到“输入”文件结束符的效果,结束循环。
3、while(scanf("%d",&n)==1)
功能:赋值失败,跳出循环
这个应该很好理解了吧,如果是scanf("%d%d",&n,&m就是while(scanf("%d %d",&a,&b)==2)。
=============
while (~scanf("%d%d",&n,&m))
while (~scanf("%d%d",&n,&m))等效于 while (scanf("%d%d",&n,&m)!=EOF)
~是按位取反
scanf的返回值是输入值的个数
如果没有输入值就是返回-1
-1按位取反结果是0
while(~scanf("%d", &n))就是当没有输入的时候退出循环
===========
while(scanf("%d",&n),n)和while(scanf("%d",&n)!=EOF)和while(scanf("%d",&n)==1)和while(~scanf("%d",&n)
第一个遇到0结束;
第二个和第四个一样,在windows下按ctrl+Z终止,在linux下按ctrl+D终止;
第三个是指正确接收对应的变量个数,要是while(scanf("%d%d",&n,&n1)==2)这时候就为2了,在windows下按ctrl+Z终止,在linux下按ctrl+D终止。
============
2011 多项式求和
顺着递归
你也可以顺着递归,这就随你喜欢了。
答案没看懂。
puts和putchar
输入输出格式相关函数
注意判断输入的数据是否需要处理(排列顺序、正负判定,然后再进行运算,
2013多做推理题~ 这个推理拿纸笔,手推一遍、
连用两个三目运算符可以替换 if elseif else
int* 是类型说明
()是强制转换运算符
(int *)a是表示把a强制转换成一个int型的指针。
如果以前a是char型,编译器会认为a指向的那一个字节的内存单元是a里面的东西
把a转换成int型,编译器会认为a指向的连续四个字节里的东西都是a里面的。
*(int *)a就是取a指向的内容的意思,跟*a的那个*作用一样
return *(int*)a-*(int*)b;就是返回a b两个地址中的 整型 数据 的差!
ceil(x) 返回 不小于x的最小整数值(返回值为浮点型)。
floor(x) 返回 不大于x的最大整数值(返回值为浮点型)。
round(x) 返回 x的四舍五入整数值(返回值为浮点型)。
C语言运算符优先级(超详细) - yuliying的专栏 - CSDN博客
https://blog.csdn.net/yuliying/article/details/72898132
注意其中三目运算符是右结合性
运算符优先级_百度百科
https://baike.baidu.com/item/运算符优先级/4752611?fr=aladdin
#include <stdio.h>
#include <stdlib.h>
int cmp(const double *a, const double *b)
{ return *a > *b ? 1 : *a < *b ? -1 : 0; }
int main(void)
{ int n, i; double x, y[100];
while (scanf("%d", &n) != EOF) {
for (i = 0 ; i < n ; i++)
scanf("%lf", y + i); ..//关于数组中元素的输入表达方式,所有的表达方式。!!!!等待search
qsort(y, n, sizeof(double), cmp);
for (x = 0, i = 1 ; i < n - 1 ; i++)
x += y[i];
printf("%.2f ", x / (n - 2)); }
return 0; }
#include <stdio.h>
int main(void)
{ int n, i;
double min, max;
double x, y;
while (scanf("%d", &n) != EOF)
{ scanf("%lf", &x);
min = max = x;
for (i = 1 ; i < n ; i++) {
scanf("%lf", &y);
x += y; // 不要总想着开数组,只要把整个和加起来,然后减去最大和最小值就可以。循环的时候一次性找着最大值最小值,可以办到的啊~
if (y > max)
max = y;
if (y < min) min = y; }
printf("%.2lf ", (x - min - max) / (n - 2));
}
return 0; }
http://www.mamicode.com/info-detail-2323132.html
http://www.pinlue.com/article/2018/04/2914/586227517711.html