用C++写数学(一): 基本函数

用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));
} 
发布了17 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/cjz2005/article/details/104668311