码迷,mamicode.com
首页 > 编程语言 > 详细

C语言中数学相关知识点

时间:2017-07-31 22:10:51      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:can   返回值   define   它的   ring   大小   符号   --   取值   

 

快速求幂取模

积的取余等于取余的积取余

代码如下:

int pow(int a,int n,int b)//返回值是a的n次方对b取余后的值

{

    int result=1;

    a=a%b;//积的取余等于取余的积取余

    while(n>0)

    {

        if(n%2==1)

            result=result*a%b;//n是奇数的话就要多乘一次,原理和前面的二分求幂一样

        n=n/2;//二分

        a=a*a%b;//积的取余等于取余的积取余

    }

    return result;

}

******************************************************************************

筛法求素数

用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。

代码如下:

#include<stdio.h>

#include<string.h>

#include<math.h>

#define N 10000//N的大小可以根据需要变化

int a[N];//利用数组的下标记录要判断的数字

void is_sushu()

{

    memset(a,0,sizeof(a));//对数组a进行初始化为0,不是素数的标记为1,剩下为0的就是素数了

    a[1]=1;           //1既不是素数也不是合数,先标记为0

    for(int i=2; i<=sqrt(N); i++)

    {

        if(a[i]==0)            //如果i是素数

        {

            for(int j=2; j*i<=N; j++)  //循环标记的范围是i*j<N

            {

                a[i*j]=1;        //如果i是素数,那么i*j肯定不是素数

            }

        }

    }               //最终所有非素数都标记为1,素数都标记为0

}

*******************************************************************************

巴什博弈:

只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,

后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,

如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者

肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

代码如下:

#include<stdio.h>

int main()

{

         int t,sum,m;

         scanf("%d",&t);

         while(t--)

         {

         scanf("%d%d",&sum,&m);

         if (sum % (m + 1))

    printf("Win\n");

    else

    printf("Lose\n");

         }

         return 0;

}

******************************************************************************

矩形的个数

在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形。

while(scanf("%f%f",&a,&b)!=EOF)

{

printf("%.0f\n",(a+1)*a*(b+1)*b/4);

蔡勒公式(根据日期计算出周几)

W=[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1 (其中[ ]为取整符号)

W是所求日期的星期数.

如果求得的数大于7,可以直接对7取余,不过周日就输出为0了。

如果求得的数小于0,可以加上7的倍数,直到结果大于零小于7为止

c是公元年份的前两位数字,

y是已知公元年份的后两位数字;

m是月数,

d是日数.

方括[ ]表示只截取该数的整数部分。

 

所求的月份如果是1月或2月,则应视为前一年的13月或14月.

所以公式中m 的取值范围不是1-12,而是3-14.

模板代码:

int Change(int year,int month,int day)//根据日期判断出星期几

{

    if(month==1||month==2)

    {

        month+=12;

        year--;

    }

    int c=year/100;

    int y=year%100;

    int m=month;

    int d=day;

    int W=c/4-2*c+y+y/4+26*(m+1)/10+d-1;

    if(W<0)

        return (W+(-W/7+1)*7)%7;

    return W%7;

}

最大公约数和最小公倍数

给出两个正整数,求出它们的最大公约数和最小公倍数。

scanf("%u%u",&u,&v);

                   d=u*v;

                   while(v!=0)

                   {

                            r=u%v;

                            u=v;

                            v=r;

                   }

printf("%u %u\n",u,d/u);

 

C语言中数学相关知识点

标签:can   返回值   define   它的   ring   大小   符号   --   取值   

原文地址:http://www.cnblogs.com/jidgbo123456/p/7265799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!