您的位置:首页 > 其它

一些常用的算法笔记(烂笔头,不断学习、搜集更新...)

2010-04-08 18:40 671 查看
1)闰年的计算方法:公元纪年的年数可以被四整除,即为闰年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。

2)辗转相除法求最大公约数和最小公倍数

先用辗转相除法求出最大公约数,然后再利用(最小公倍数=两数乘积/最大公约数)求得最小公倍数。

//非递归算法
int gcd(int a, int b)
{
int temp;
if(a < b) //swap(a,b) 交换a和b
{
temp=b;
b=a;
a=temp;
}
temp=0;
while((temp = a % b) != 0) //辗转相除
{
a = b;
b = temp;
}
return b;
}
//递归算法
int gcd (int a,int b)
{
if (b==0)
return a;
return gcd(b,a%b);
}
//非递归算法
int gcd(int a, int b)
{
int temp;
if(a < b) //swap(a,b) 交换a和b
{
temp=b;
b=a;
a=temp;
}
temp=0;
while((temp = a % b) != 0) //辗转相除
{
a = b;
b = temp;
}
return b;
}
//递归算法
int gcd (int a,int b)
{
if (b==0)
return a;
return gcd(b,a%b);
}

计算法N个数的最大公约数算法:

view plaincopy to clipboardprint?
int ngcd(int *pa, int n)
{
if(n == 1)
return *pa;
return (gcd(pa[n-1], ngcd(pa, n-1)));
}
int ngcd(int *pa, int n)
{
if(n == 1)
return *pa;
return (gcd(pa[n-1], ngcd(pa, n-1)));
}

计算最小公倍数算法:

view plaincopy to clipboardprint?
int lcm(int a, int b) //最小公倍数 = 两数乘积 / 最大公约数
{
return a*b/gcd(a, b);
}
int lcm(int a, int b) //最小公倍数 = 两数乘积 / 最大公约数
{
return a*b/gcd(a, b);
}

计算N个数的最小公倍数的算法:

view plaincopy to clipboardprint?
int nlcm(int *pa, int n)
{
if(n == 1)
return *pa;
return lcm(pa[n-1], nlcm(pa, n-1));
}



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
注意一定是两数异号时才是这种规则,同号时跟一般的算法相同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: