1)闰年的计算方法:公元纪年的年数可以被四整除,即为闰年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。
2)辗转相除法求最大公约数和最小公倍数
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
最小公倍数为:a*b/最大公约数。
欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:
void swap(int & a, int & b)
{
int c = a;
a = b;
b = c;
}
int gcd(int a,int b)
{
if(0 == a )
{
return b;
}
if( 0 == b)
{
return a;
}
if(a > b)
{
swap(a,b);
}
int c;
for(c = a % b ; c > 0 ; c = a % b)
{
a = b;
b = c;
}
return b;
}
当然还有个递归版的, 其实gcd函数一般不会递归调用很多次, 所以递递归还是不错的,同样要保证参数a>=b才行:
int gcd(int a, int b)
{
if (b > 0)
{
return gcd(b, a % b);
}
return a;
}
3)求一个整数的N进制数
//求一个数的n进制(为了打印方便n<=16,仅作演示)
#include <stdio.h>
//递归方法
void nHexRecursion(int x,int d)
{
if(x<d)
{
printf("%x", x);
}
else
{
nHexRecursion(x/d,d);
printf("%x",x%d);
}
}
//非递归
void nHexNonRecursion(int x,int d)
{
int output[100]; // 这种做法很恶心
int i=0;
while(x>0)
{
if(x/d)
{
output[i]=x%d;
}
else
{
output[i]=x;
}
x/=d;
i++;
}
while(--i>=0)
{
printf("%d",output[i]);
}
}
int main()
{
int num=16,dem=2;
printf("Please input the num:/n");
scanf("%d",&num);
printf("Please input the dimension:/n");
scanf("%d",&dem);
nHexRecursion(num,dem); // 递归调用
printf("/n");
nHexNonRecursion(num,dem); // 非递归调用
printf("/n");
return 0;
}
4) 打印素数
#include <stdio.h>
void PrintPrime(int start,int end)
{
for(int i=start;i<=end;i++)
{
int flag=1;
for(int j=2;j<i/2;j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag)
{
printf("%d ",i);
}
}
}
int main()
{
PrintPrime(1,100);
return 0;
}
6)异号求余的规则:A%B=C,则C的值为:|A|%|B|的结果,让这个结果与A同号,然后在和B相加。比如:
|-15|%|4|=3,然后-3+4=1
如果是15%(-4),则结果为 3+(-4)=-1
注意一定是两数异号时才是这种规则,同号时跟一般的算法相同