# 常用算法

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);
}
}

• 本文已收录于以下专栏：

## 数学建模学习笔记（建模中的十大常用算法总结）

• Songjs19931206
• 2015年02月03日 16:18
• 2792

## JAVA常用算法手册学习笔记

• u012293810
• 2015年11月22日 21:09
• 1374

## C_C+++常用算法整理+可运行

C_C+++常用算法整理(先放在这儿，以后总结) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
• JohnnyHu90
• 2013年10月08日 18:49
• 6401

## C/C++常用算法手册.pdf免费下载

《C/C++常用算法手册》：计算机程序设计语言林林总总，程序设计的应用领域和应用方向也各不相同。但是不管采用什么程序设计语言，不管是应用在嵌入式底层开发、WEB应用开发、或者MIS系统开发……代码中所...
• u012550652
• 2013年10月23日 23:07
• 2546

## 芒果iOS开发之常见算法总结

• CrazyZhang1990
• 2015年10月30日 15:42
• 2271

## 十大开发常用算法

• lee_nacl
• 2017年03月11日 16:06
• 1565

## JS常用算法-个人整理

• LINQIUDI
• 2016年08月06日 15:50
• 319

## 5大常用算法总结

• piriter
• 2014年12月09日 18:46
• 1601

## 五大常用算法&实例列举

• Scotfield_msn
• 2016年09月14日 01:16
• 699

## MATLAB语言常用算法程序集

• zhangkaihang
• 2012年09月08日 15:38
• 12290

举报原因： 您举报文章：常用算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)