数学小知识

有自己整理的,也有转别人的,方便查看


知一整数数,构造两个整数,使这三个数满足勾股定律

int gougu(int a,int &b,int &c)
{
	if(a<=2)
	{
		return 0;
	}
	if(a&1)
	{
		b=(a*a)/2;
		c=b+1;
	}
	else
	{
		b=(a*a)/4-1;
		c=(a*a)/4+1;
	}
	return 1;
}



知三点坐标求这个三个点构成的三角形的周长、面积、外心坐标和重心坐标

面积使用海伦公式求解 

外心坐标是看的一篇博客 http://blog.sina.com.cn/s/blog_7a92dda00101f2kp.html   ,有详细的求解过程,还有内心坐标

重心坐标就简单了  (x1+x2+x3)/3 , (y1+y2+y3)/3

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
struct node
{
	double x,y;
};
double  len(node n1,node n2)
{
	double ans;
	ans=sqrt(pow(n1.x-n2.x,2)+pow(n1.y-n2.y,2));
	return ans;
}
int main()
{
	double l,s,l1,l2,l3;
	node n1,n2,n3,a1,a2;
	scanf("%lf %lf",&n1.x,&n1.y);
	scanf("%lf %lf",&n2.x,&n2.y);
	scanf("%lf %lf",&n3.x,&n3.y);
	
	//三边长度 
	l1=len(n1,n2);
	l2=len(n1,n3);
	l3=len(n2,n3);
	
	//周长 
	l=l1+l2+l3;
	printf("%.2lf\n",l);
	
	//面积 
	double p;
	p=l/2.0;
	s=sqrt(p*(p-l1)*(p-l2)*(p-l3));
	printf("%.2lf\n",s);
	
	//外心坐标 
	a1.x=(pow(n1.x,2)*(n2.y-n3.y)+pow(n2.x,2)*(n3.y-n1.y)+pow(n3.x,2)*(n1.y-n2.y)-(n1.y-n2.y)*(n2.y-n3.y)*(n3.y-n1.y))/(2*(n1.x*(n2.y-n3.y)+n2.x*(n3.y-n1.y)+n3.x*(n1.y-n2.y)));
	a1.y=(-pow(n1.y,2)*(n2.x-n3.x)-pow(n2.y,2)*(n3.x-n1.x)-pow(n3.y,2)*(n1.x-n2.x)+(n1.x-n2.x)*(n2.x-n3.x)*(n3.x-n1.x))/(2*(n1.x*(n2.y-n3.y)+n2.x*(n3.y-n1.y)+n3.x*(n1.y-n2.y)));
	printf("%.2lf %.2lf\n",a1.x,a1.y);
	
	//重心坐标 
	a2.x=(n1.x+n2.x+n3.x)/3;
	a2.y=(n1.y+n2.y+n3.y)/3;
	printf("%.2lf %.2lf\n",a2.x,a2.y);
	return 0;	
 }





俩圆相交面积

struct point{
    double x, y;
};
double dis(point a, point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double Area(point c1, double r1, point c2, double r2){
    double tmpa = r1, tmpb = r2;
    if(tmpa < tmpb) swap(tmpa,tmpb);
    double res = 0;
    double dd = dis(c1, c2);
    if(dd > tmpa -tmpb && dd < tmpa + tmpb){
        double cos1 = (tmpa*tmpa+dd*dd-tmpb*tmpb)/(2*tmpa*dd);
        double cos2 = (tmpb*tmpb+dd*dd-tmpa*tmpa)/(2*tmpb*dd);
        double th1 = 2*acos(cos1);
        double th2 = 2*acos(cos2);
        double s1 = 0.5*tmpa*tmpa*sin(th1);
        double s2 = 0.5*tmpb*tmpb*sin(th2);
        double s3 = (th1/2)*tmpa*tmpa;
        double s4 = (th2/2)*tmpb*tmpb;
        res = s3+s4-s1-s2;
    }
    else if(dd <= tmpa - tmpb)
        res = pi*tmpb*tmpb;
    return res;
}

把一个数转化为-n进制,每次模-n记录,除-n,类似转二进制,然后从最低位开始,遇到位数小于0的就加上个n,然后高一位加1,类似借位
int ans[100],len;
int fujinzhi(int n,int x)
{
	int j;
	memset(ans,0,sizeof(ans));
	len=0;
	if(n==0)
	{
		ans[0]=0;
		len=1;
		return 0; 
	}
	while(n)
	{
		ans[len++]=n%x;
		n/=x;
	}
	for(j=0;j<100;j++)
	{
		if(ans[j]<0)
		{
			ans[j]+=-1*x;
			ans[j+1]++;
		}
		else if(ans[j]>=-1*x)
		{
			ans[j]-=-1*x;
			ans[j+1]--;
		}
	}
	while(ans[len]!=0)
	len++;
/*	for(j=len-1;j>=0;j--)
	printf("%d",ans[j]);
	printf("\n");*/
	return 0;
}


大数求卡特兰数

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
#define inf 0x3f3f3f3f
#define rep(i,be,n) for(i=be;i<n;i++)
typedef long long ll;
using namespace std;
const int MAXN=1000;
int mult(int *a,int &len,int x)
{
	int i=0,temp=0;
	for(;i<len;i++)
	{
		temp+=a[i]*x;
		a[i]=temp%MAXN;
		temp/=MAXN;
	};
	while(temp!=0)
	{
		a[len++]=temp%MAXN;
		temp/=MAXN;
	}
	return 0;
}
int division(int *a,int &len,int x)
{
	int i=len-1,temp=0;
	for(;i>=0;i--)
	{
		temp+=a[i];
		a[i]=temp/x;
		temp%=x;
		temp*=MAXN;
	}
	for(;len-1>=0;len--)
	{
		if(a[len-1]!=0)
		break;
	}
	return 0;
}
int ans[150][1000];
int len[150];
int main()
{
	int i,j,t,a[1000],len1;
	ans[0][0]=ans[1][0]=1;
	len[0]=len[1]=1;
	
	for(i=2;i<=100;i++)
	{
		MEM(a);
		len1=len[i-1];
		for(j=0;j<len1;j++)
		{
			a[j]=ans[i-1][j];
		}
		mult(a,len1,4*i-2);
		division(a,len1,i+1);
		for(j=0;j<len1;j++)
		{
			ans[i][j]=a[j];
		}
		len[i]=len1;
	}	
	while(scanf("%d",&t))
	{
		if(t==-1)
		break;
	//	printf("%d\n",len[t]);
		for(i=len[t]-1;i>=0;i--)
		{
			if(i==len[t]-1);
			else if(ans[t][i]<10)
			printf("00");
			else if(ans[t][i]<100)
			printf("0");
			printf("%d",ans[t][i]);
		}
		printf("\n");
	}
	return 0;
 }


公式:
1/p+1/p^2+1/p^3+1/p^4+...=1/(p-1)     (p!=1)



几何分布:(转自http://blog.youkuaiyun.com/baidu_35643793/article/details/76267672

先给出一个几何分布的分布列


其中,

x表示第x次抽中

p表示第中的概率

对于每一次抽奖:中奖概率p为3/4,不中奖概率(1-p)为1/4;

1.什么是几何分布

简言之,几何分布就是前n次都没有抽中,第n+1次抽中的概率;

2.几何分布的期望

假设,对于每一次抽奖,抽中的概率为p,未抽中的概率为(1-p);

则期望为1/p;

一维离散性概率分布的期望计算公式为:

所以用计算公式所得结果与1/p相比较,更加直观,当然1/p是根据推导公式得来的;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值