欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法中常用函数

程序员文章站 2022-05-29 18:52:35
...

目录

pow()函数:求x的y次方(次幂)

memset()函数:将内存的前n个字节设置为特定的值

 abs()函数:求绝对值(整数)

将int转换为string的两种方法(to_string、字符串流)

第一种

第二种

string对象与数值互相转换

reverse:反向排序算法

isdigit()函数:判断字符是否为阿拉伯数字

#include

▲setw(n)用法: 通俗地讲就是预设宽度

▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充

▲setbase(int n) : 将数字转换为 n 进制.(感觉这个会常用到)

▲ setprecision用法

控制小数点后的位数


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;

 

 


 


 

相关标签: hanshu