现在的位置: 首页 > 综合 > 正文

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

2013年10月06日 ⁄ 综合 ⁄ 共 1542字 ⁄ 字号 评论关闭

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
注意一定是两数异号时才是这种规则,同号时跟一般的算法相同

抱歉!评论已关闭.