用C++写数学很有用,写几个函数和类,可以很快解决数学问题。
今天带来几个普通的函数:
1.判断float是否为整数
float为浮点型,但也可以是整数(如3.0),为判断是否为整数,这个函数可能会有一点用处:
bool is_float(float a)
{
return (a - int(a) != 0);
}
很简单,拿它去减它的整数部分不为0就是小数。
以及
bool is_integer(float a)
{
return !is_float(a);
}
#define is_int is_integer
2.判断是否为质数(素数)
这个很常见,随便例举一种方法:
bool is_prime(int a)
{
unsigned i=2;
while(i < a)
{
if(a % i == 0)
break;
i++;
}
if(i == a)
return true;
else
return false;
}
3.判断是否为平方数
bool is_square(int a)
{
return is_int( sqrt(a) );
}
4.获取整数部分/小数部分
int get_int(float f)
{
return int(f);
}
float get_deci(float f) //获取它的小数部分
{
return fabs(f - int(f));
}
5.比较数字大小
其实也没必要,许多标准库都有max min.
template <typename _T>
_T& CJZAPI larger(_T& A,_T& B)
{
return A > B ? A : B;
}
template <typename _T>
_T& CJZAPI smaller(_T& A,_T& B)
{
return A < B ? A : B;
}
#define bigger larger
6.平方/次方
这个cmath是有的,只是稍微添一点儿.
#ifndef pow2
//#define pow2(x) x*x
template <typename _T>
_T pow2(_T x)
{
return x * x;
}
#endif
template <typename _T>
_T pow3(_T x)
{
return x * x * x;
}
#define square pow2
#define cube pow3
//***多次方就用pow函数就可以了。***//
7.平方根/次方根/多次方根
#define root sqrt
#define root2 root
template <typename _T>
double root3(_T sth)
{
return pow(sth,1.0/3.0);
}
template <typename _T>
double root4(_T sth)
{
return pow(sth,1.0/4.0);
}
template <typename _Tp,typename _Up=unsigned>
double rootn(_Tp sth,_Up nTimes)
{
return pow(sth,1.0 /
nTimes
);
}
利用了那个公式。
8.三角面积
template <typename _T>
double Area3(_T a , _T h) //三角面积
{
return 0.5 * a * h;
}
template <typename _T>
double Area3(_T s1 , _T s2 , _T s3) //三角面积: 海伦公式
{
const double p = (s1+s2+s3)/2.0;
return sqrt( p * (p - s1) * (p - s2) * (p - s3));
}
//秦九昭公式也可以,因为两者可以转化。
9.两点距离
//POINT需包含windows.h(windef.h)
double Distance(POINT &a,POINT &b) //两点之间的距离
{
return sqrt(pow2(a.x - b.x) + pow2(a.y - b.y));
}
double DistanceO(POINT &pt) //离原点的距离
{
return sqrt(pow2(pt.x) + pow2(pt.y));
}
template <typename _T1,typename _T2> //overloading
double Distance(_T1 x1_or_y1 , _T2 x2_or_y2) //在横纵直线上
{
return abs(x1_or_y1 - x2_or_y2);
}
template <typename _T1,typename _T2>
double DistanceO(_T1 x , _T2 y)
{
return sqrt(pow2(x) + pow2(y));
}
附带
double Area3(POINT &a,POINT &b,POINT &c) //三角面积:坐标系中
{
return Area3(Distance(a,b),Distance(a,c),Distance(b,c));
}