c语言触及到那些数学知识,C语言中数学相关知识点(示例代码)

快速求幂取模

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

代码如下:

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

#include

#include

#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

{

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

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);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值