标签: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);
标签:can 返回值 define 它的 ring 大小 符号 -- 取值
原文地址:http://www.cnblogs.com/jidgbo123456/p/7265799.html