# 常用算法

1、求素数

The Sieve of Eratosthenes埃拉托尼筛子是求素数的高效算法。

const int N = 100; //求100以内的素数
int z[N + 1] = {0};
//初始化数组以记录是否为素数，多一个是为了下标清晰不至于困扰于 j-1？ 这样的问题
//外圈循环：从自然数2开始，对每一个数进行操作，直到N/2。
//内圈循环：从外圈循环因子的倍数开始，对应数组元素置1，直到N。

for (int i = 2; i <= N / 2; i++)
for (int j = 2 * i; j <= N; j += i)
z[j] = 1;
int Num = 0; //记录素数个数
for (i = 2; i <= n; i++)
if (z[j] == 0)
Num++;

2、最大公约数和最小公倍数

//求最大公约数
void GreatestCommonDivisor ()
{
while (1)
{
int m = 0, n = 0;
cin >> m >> n;

if (m == 0 || n == 0) return;
if (m <= 1 || n <= 1)
{
cout << "Values should be larger than 1" << endl;
continue;
}
int a = (m > n) ? m : n;
int b = (m > n) ? n : m;
int c = 0;
while ((a % b) != 0)
{
c = a % b;
a = b;
b = c;
}
cout << m << " " << n << " GreatestCommonDivisor = " << b << endl;
}
}
//求最小公倍数
void LeastCommonMultiply ()
{
//两数相乘再除以最小公倍数
while (1)
{
int m = 0, n = 0;
cin >> m >> n;

if (m == 0 || n == 0) return;
if (m <= 1 || n <= 1)
{
cout << "Values should be larger than 1" << endl;
continue;
}
int a = (m > n) ? m : n;
int b = (m > n) ? n : m;
int c = 0;
while ((a % b) != 0)
{
c = a % b;
a = b;
b = c;
}
cout << m << " " << n << " GreatestCommonDivisor = " << b << endl;
cout << m << " " << n << "LeastCommonMultiply = " << m * n / b << endl;
}
}

1、公约数、公倍数
int m = 0, n = 0 ,r = 0;
cin >> m >> n;
if (m < n)
{
r = n;
n = m;
m = r;
}
r = m % n;
while (r != 0)
{
m = n;
n = r;
r = m % n;
}
cout << n << endl;
cout << a * b / n << endl;

2、判断素数
bool prime (int m)
{
int r = sqrt (m);
for (int i = 2; i <= r; i++)
if (m % i == 0)
return false;
return true;
}

3、求素数
void prime ()
{
const int N = 100;
int a[101] = {0};
for (int i = 2; i <= N / 2; i++)
for (int j = 2 * i; j <= N; j += i)
a[j] = 1;
for (i = 1; i <= N; i++)
if (a[i] == 0)
cout << i << '/t';
}

4、歌德巴赫猜想 ( >=6 的偶数可分解成二素数之和)
bool gedebahe (int m)
{
for (int r = 1; r <= m /2; r++)
if (prime (r) && prime (m - r))
return true;
return false;
}

5、生成随机数
void rands (int* a, int num)
{
srand ((unsigned int)time (NULL));

for (int i = 0; i < num; i++)
{
a[i] = rand () % 10;
cout << a[i] << endl;
}
}

6、选择法排序 (升序)
void select_sort (int* a)
{
int min = 0;
for (int i = 0; i < 9; i++) //从左到右的循环因子，用以被比较
for (int j = i + 1; j < 10; j++)
if (a[i] > a[j])
{
min = a[j]; a[j] = a[i]; a[i] = min;
}
}

7、冒泡法排序 (升序)
void pop_sort (int* a)
{ for (int i = 0; i < 9; i++)
//从右到左的循环因子，用以计算里圈循环的空位
for (int j = 0; j < 9 - i; j++)
if (a[j] > a[j + 1])
{
min = a[j]; a[j] = a[j + 1]; a[j + 1] = min;
}
}

8、有序数组合并 (升序)
void unite (int* a, int numA, int* b, int numB, int* c, int numC)
{
int i = 0, j = 0, k = 0;
//各自的循环因子，互不干扰
for (; i < numA && j < numB; k++)
{
if (a[i] < b[j])
{
c[k] = a[i];
i++;
}
else
{
c[k] = b[j];
j++;
}
}
if (i < numA)
for (; i < numA; k++, i++)
c[k] = a[i];
else
for (; j < numB; k++, j++)
c[k] = a[j];
}

9、有序数组中折半查找
int half_find (int* a, int num, const int dst)
{
int lower = 0, upper = num - 1, mid = (upper + lower) / 2;
while (dst != a[mid])
{
if (dst > a[mid])
lower = mid + 1;
else
upper = mid - 1;
mid = (upper + lower) / 2;
if (lower >= upper)
return -1;
}
return mid;
}

10、方阵转置
void reverse_matrix (int a[3][3], int num)
{
int t = 0;
for (int i = 0; i < num; i++)
{
for (int j = i; j < num; j++)
{
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
}

11、迭代法开平方
float iteration (float a)
{
float b = a / 2;
int i = 0;
while (abs (b * b - a) > 0.0001)
{
if (b * b > a)
b -= 0.001f;
else
b += 0.001f;
if (++i > 999999999)
{
cout << "NOFOUND/n";
return -1;
}
}
return b;
}

12、数值转换
void trdec(int idec, int ibase, char* ret)
{
if (idec < ibase) //数值大于9时，应该用字母来拓展
{
ret[0] = '0' + idec;
ret[1] = '/0';
return;
}
int i = 0, j = 0;
while (idec / ibase != 0)
{
ret[i++] = '0' + idec % ibase;
idec /= ibase;
}
ret[i] = '0' + 1;
for (; j <= i / 2; j++)
{
ret[i + 1] = ret[j];
ret[j] = ret[i - j];
ret[i - j] = ret[i + 1];
}
ret[i + 1] = '/0';
}

13、统计单词数
int count_words (char* a)
{
int word = 0, count = 0;
char* p = a;
while (*p != '/0')
{
if(*p < 'z' && *p > 'A')
{
if (0 == word)
{
word = 1;
count++;
}
}
else
word = 0;
p++;
}
return count;
}

14、穷举法计算，100张5、1、0.5RMB组合成100元
void exhaustion ()
{
int x = 0, y = 0, z = 0;
for (; x < 100 / 5; x++)
for (y = 0; y < 100 / 1; y++)
{
z = 100 - x - y;
if (5*x + 1*y + 0.5*z == 100)
cout << x << "/t" << y << "/t" << z << endl;
}
}

15、递归求阶乘
int fabtorial (int a)
{
if (0 == a)
return 1;
else
return a * fabtorial (a - 1);
}

16、直接插入排序 （升序）
void InsertSort (int* a, int num)
{
int temp = 0, i = 0, j = 0;
for (i = 1; i < num; i++)
{
temp = a[i];
//只有大于的时候，才进行移动，边比较查找边移动
for (j = i - 1; temp < a[j] && j >= 0; j--)
a[j + 1] = a[j];
//插入数据
a[j + 1] = temp;
}
}

17、折半插入排序 （升序）
void BiInsertionSort (int* a, int num)
{
int temp = 0, high = 0, low = 0, mid = 0, i = 0, j = 0;
for (i = 1; i < num; i++)
{
temp = a[i]; high = i - 1; low = 0;
//折半查找插入位置
while (low <= high)
{
mid = (low + high) / 2;
if (temp < a[mid])
high = mid - 1;
else
low = mid + 1;
}
//移动插入点后的数据
for (j = i - 1; j >= low; j--)
a[j + 1] = a[j];
//插入数据
a[low] = temp;
}
}

18、定时器
void sleep (int second)
{
time_t st = 0, et = 0;
time (&st);
et = st;
while (et - st < second)
{
st = et;
time (&et);
}
}

#### 常用算法程序集(C语言描述) (PDF高清电子书+源代码).

2016年01月12日 6.35MB 下载

#### 常用算法程序集第四版（C++语言描述）pdf版

2014年04月27日 34.44MB 下载

#### 常用算法程序集第四版（高清完整版PDF+全部代码）第二部分

2015年02月11日 18.66MB 下载

#### C/C++常用算法手册(全)

2014年06月25日 23.33MB 下载

#### 嵌入式系统软件设计中的常用算法(完整版)

2014年01月08日 17.14MB 下载

#### java常用算法手册【第三版】源代码

2018年01月26日 296KB 下载

#### Java常用算法手册

2014年12月20日 41.9MB 下载

#### 常用算法深入学习实录(光盘C语言源代码)

2014年09月03日 29.69MB 下载

#### 读《计算机常用算法与程序设计教程》

2009-09-15 09:30:00

#### java常用算法手册源码

2014年10月03日 286KB 下载