算法中有很多与数有关的经典算法,包括最大公约数,字符串与数的转化问题、素数问题等等,这些也都会在面试中出现,让我们一起来看看这些问题吧!
1.最大公约数
思路:一个简单的方法就是辗转相除法(欧几里得算法),就是用最大的数除以较小的数,结果的余数和被除数构成新的一对数,继续上面的除法,直到大数被小数整除(余数为0),得到的较小的数就是最大公约数。
例如:20 12
过程:<20%12> = 8 ; <12%8> = 4; <8%4>==0,result = 4;
代码如下,直接上码图:
2.字符串与整数之间的转化
字符串转化为整数的方法就是:
char c;
int a;
a = c - '0'
反过来则是
char a;
int c;
c = a +'0'
代码如下,直接上码图:
3.素数的求法
思路:用筛法,先把N个自然数按次序排列起来,对1来说不是素数,不合法,划去。对2来说是素数留下,然后把2后面所有能被2整除的数都划去。在计算2后面没有被划去的整数3,继续对2的操作。最后留下的就是素数。
代码如下,直接上码图:
4.字符串到实数的转化
代码如下,直接上码图:
5.将一个整数因式分解
思路一:对于一个整数n,注意因式是从小的开始的,求出一个小的因子f1后,此时应该在[f1,f2](f2 = n/f1)之间求二级因子。如此反复,直到最后因子在[fn-1,fn]之间找不到整除的因子为止。
代码如下,直接上码图:
6.不用比较运算符,求两个数的最大值
用宏定义 #define MAX(a,b) a>b?a:b 则用到了比较运算符
不用比较运算符可以利用a 与b的差的绝对值的性质来解决
#define MAX(a,b) (a+b+abs(a-b))/2
7.将一个整数分解成为两个数的和
在[1,n/2]范围内找到i 和n-i就行