算法中常用函数
目录
将int转换为string的两种方法(to_string、字符串流)
▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充
▲setbase(int n) : 将数字转换为 n 进制.(感觉这个会常用到)
pow()函数:求x的y次方(次幂)
头文件:#include <math.h>
pow() 函数用来求 x 的 y 次幂(次方),其原型为:
double pow(double x, double y);
pow()用来计算以x 为底的 y 次方值,然后将结果返回。设返回值为 ret,则 ret = x^y。
可能导致错误的情况:
- 如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误。
- 如果底数 x 和指数 y 都是 0,可能会导致 domain error 错误,也可能没有;这跟库的实现有关。
- 如果底数 x 是 0,指数 y 是负数,可能会导致 domain error 或 pole error 错误,也可能没有;这跟库的实现有关。
- 如果返回值 ret 太大或者太小,将会导致 range error 错误。
错误代码:
- 如果发生 domain error 错误,那么全局变量 errno 将被设置为 EDOM;
- 如果发生 pole error 或 range error 错误,那么全局变量 errno 将被设置为 ERANGE。
memset()函数:将内存的前n个字节设置为特定的值
头文件:#include <string.h>
memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:
void * memset( void * ptr, int value, size_t num );
参数说明:
- ptr 为要操作的内存的指针。
- value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换。
- num 为 ptr 的前 num 个字节,size_t 就是unsigned int。
【函数说明】memset() 会将 ptr 所指的内存区域的前 num 个字节的值都设置为 value,然后返回指向 ptr 的指针。
memset() 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。例如
char str[20];
memset(str, '\0', sizeof(str)-1);
返回值】返回指向 ptr 的指针。
注意:参数 value 虽声明为 int,但必须是 unsigned char,所以范围在0 到255 之间。
abs()函数:求绝对值(整数)
头文件:#include <stdlib.h>
定义函数:int abs (int j);
函数说明:abs()用来计算参数j 的绝对值,然后将结果返回。
返回值:返回参数j 的绝对值结果。
将int转换为string的两种方法(to_string、字符串流)
第一种
to_string这个函数还是很强大的!
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val)
不仅int可以转换成string,这些都可以哦~
第二种
标准库定义了三种类型字符串流:istringstream,ostringstream,stringstream
看名字就知道这几种类型和iostream中的几个非常类似,分别可以读、写以及读和写string类型,它们也确实是从iostream类型派生而来的。
要使用它们需要包含sstream头文件。
除了从iostream继承来的操作
1.sstream类型定义了一个有string形参的构造函数,
即: stringstream stream(s); 创建了存储s副本的stringstream对象,s为string类型对象
2.定义了名为str的成员,用来读取或设置stringstream对象所操纵的string值:
stream.str(); 返回stream中存储的string类型对象
stream.str(s); 将string类型的s复制给stream,返回void
构造函数:
string Int_to_String(int n)
{
ostringstream stream;
stream<<n; //n为int类型
return stream.str();
}
string对象与数值互相转换
#include<iostream>
#include<string>
#include<stdio.h>
#include <algorithm>
#include<vector>
#include<sstream>
using namespace std;
//string对象与数值互相转换
//C++方法:将数值转换成string
string convertToString(double x)
{
ostringstream o;
if(o<<x)
return o.str();
return "conversion error";//if error
}
//C++方法:将string转换成数值
double convertFromString(const string &s)
{
istringstream i(s);
double x;
if(i>>x)
return x;
return 0.0;//if error
}
reverse:反向排序算法
头文件:#include<algorithm>
vector<int> a(10);
reverse(a.begin(),a.begin()+10); // 等价于 reverse(a.begin(),a.end());
从a.begin()到a.begin()+10之前的数 反向排序
isdigit()函数:判断字符是否为阿拉伯数字
头文件:#include <ctype.h>
定义函数:int isdigit(int c);
函数说明:检查参数 c 是否为阿拉伯数字0 到9。
返回值:若参数c 为阿拉伯数字,则返回true,否则返回null(0)。
附加说明:此为宏定义,非真正函数。
#include<iomanip>
io代表输入输出,manip是manipulator(操纵器)的缩写
主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常见的控制函数的:
▲setw(n)用法: 通俗地讲就是预设宽度
cout << setw( 3 ) << 1 << setw( 3 ) << 10 << setw( 3 ) << 100 << endl; 输出结果为
_ _1_10100 (默认是右对齐)当输出长度大于3时(<<1000),setw(3)不起作用。
▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充
如 cout<<setfill(‘@‘)<<setw(5)<<255<<endl;
结果是:
@@255
应当指出,setw只作用于紧随其后的部分,例如cout<<setfill('*')<<setw(6)<<123<<456;
的运行结果为(***123456)
这里setfill('*')<<setw(6)
只对 123 起作用输出了***123,456作为另一部分随后输出
▲setbase(int n) : 将数字转换为 n 进制.(感觉这个会常用到)
如
cout<<setbase(8)<<setw(5)<<255<<endl;
cout<<setbase(10)<<setw(5)<<255<<endl;
cout<<setbase(16)<<setw(5)<<255<<endl;
- 结果是:
(空格)(空格)377
(空格)(空格) 255
(空格)(空格)(空格) f f
▲ setprecision用法
使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。
setiosflags(ios::fixed)是用定点方式表示实数,如果与setiosflags(ios::scientific)合用, 可以控制指数表示法的小数位数。
setiosflags(ios::scientific)//是用指数方式表示实数。
setiosflags(ios::fixed)// 固定的浮点显示
setiosflags(ios::scientific) //指数表示
setiosflags(ios::left) //左对齐
setiosflags(ios::right) //右对齐
setiosflags(ios::skipws) //忽略前导空白
setiosflags(ios::uppercase) //16进制数大写输出
setiosflags(ios::lowercase) //16进制小写输出
setiosflags(ios::showpoint)// 强制显示小数点
setiosflags(ios::showpos) //强制显示符号
- 例:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout<<12345.0<<endl;//输出"12345"
cout<<setiosflags(ios::fixed)<<setprecision(3)<<1.2345<<endl;//输出"1.234"(遵循四舍六入五成双的原则,而不是四舍五入的原则)
cout<<resetiosflags(ios::fixed);//需要用resetiosflags()函数清除前面的输出格式!!!!
cout<<setiosflags(ios::scientific)<<12345.0<<endl;//输出"1.23e+004"
cout<<setprecision(3)<<12345.0<<endl;//输出"1.23e+004"(这里应该不用清除,因为输出格式和上一个相同)
return 0;
}
“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上。"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:5前为奇数,舍5入1;5前为偶数,舍5不进(0是偶数)。
具体计算规则:
(1)被修约的数字小于5时,该数字舍去;
(2)被修约的数字大于5时,则进位;
(3)被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
1.1 设置域宽setw(N)
当我们需要保证输出宽度为N,预设宽度,如下:
cout<<setw(5)<<255<<endl; //运行结果:空格空格255,一共5个字宽
- 1.2 流输出八进制,十六进制
dec 置基数为10 相当于”%d”
hex 置基数为16 相当于”%X”
oct 置基数为8 相当于”%o”
例如输出一个数的16进制,如下:
cout<<hex<<255<<endl; //运行结果为:ff
- 补充说明一下,如果需要流输出二进制,则包含bitset.h头文件,调用哪个bitset()函数完成十进制输出为二进制,如下:
#include<bitset.h>
cout<<bitset<8>(255)<<endl; //运行结果为:11111111,8表示决定保留的位数。
- 1.3 填充字符setfill(char c)
setfill就是在预设宽度中,如果已存在没有用完的宽度大小,则用字符c填充。如下:
cout<<setfill('0')<<setw(5)<<255<<endl; //运行结果为:00255。
- 1.4 进制转换setbase(int n)
将某一个十进制数转换为一个n进制的数,实际上只能是8和16进制,如果是2~36任意进制还是使用stdlib.h头文件中itoa函数吧,使用如下:
cout<<setbase(8)<<setw(5)<<255<<endl; //运行结果为: 377
- 1.5 控制输出流的精度setprecision(int n)
使用setprecision(int n)可控制输出流显示浮点数的数字个数(包括整数部分)。C++默认的流输出数值有效位是6。使用如下:
cout<<setprecision(3)<<22.123<<endl; //结果为:22.1
cout<<setprecision(8)<<22.123<<endl; //结果为:22.123,比原字符长不会补零!
控制小数点后的位数
如果采用 C 语言的 printf 函数来输出,那么控制小数点后的位数形式为“printf("%*.*f", a);”,如“printf("%.3f\n",sum);”。如果采用 C++的 cout输出,那么先用“cout.precision(n);”来设定小数点后保留 n 位,然后,输出时加“fixed”参数,表明是定点输出。
//定点输出小数点后 3 位;否则是输出有效数字 3 位
cout.precision(3);
//使用 fixed,定点输出,即小数点后的精度是 3 位
cout<<fixed<<sum<<endl;
上一篇: python中的列表及列表中常用的函数
下一篇: 药膳家常菜 香酥补益气血