Chap1 基础问题

1.“%”运算符

a%b

模0(即b = 0)会产生错误导致程序终止

a 和 b 都必须是整数

结果的符号和 a 一致,而这 b 的正负无关。

对于余数 r 是 负数情况的修正:

r = a % b;
r = (r + b) % b;      //此时r必为正数余数

“%”运算符的分配率:

(a * b) % c = (a % c * b % c) % c
(a + b) % c = (a % c + b % c) % c

2.数位拆解

就是将一个数各个数位分别提取出来。

要求合理使用 % 和 / 运算符。

书中的例子:

使用了两个数组作为buffer,然后又使用了两个整数用来标记buffer中填充了几个数字。

或者通过 scanf("%s",a)来将输入作为字符串(字符数组)的形式录入,提取各位之后转换为数值再算结果。

3.进制转换

m进制数转十进制数,循环中要做两件事:

​ 1,更新权重 2,累加结果

小细节:将十六进制中的字母 A,B,,,F 转换为对应数字: 10, 11,15;

char str[40];
int x,i;
scanf("%s",a);
if(str[i] >= 'a' && str[i] <= 'z'){
    x = str[i] - 'a' + 10;			//自动类型转换(因为 x 是int型)
    printf("%d",x);   				//输出
} 
else if(str[i] >= 'A' && str[i] <= 'Z'){
    x = str[i] - 'A' + 10;            //注意大小写字母分开处理
    printf("%d",x);
} 

小细节: 上个 tip 中反着转换时:

​ 十进制数字 int x 转换成对应字符: str a = x + '0'

4,最大公约数(GCD)

问题描述:求a、 b的最大公约数c,就是求同时满足 a%c=0; b%c=0; 的最小整数。

若a = 0,则b就是他们的最大公约数。

欧几里得算法:

算法原理: a,b 的最大公约数 同时也是 b, a % b 的最大公约数,反之也成立。

步骤: 通过上述原理,不断的把问题变成规模更小的问题,直至a,b中有一个数字变为 0 。(b 变成 0)

实现:可以有递归实现 和 非递归实现(for循环)两种。

5,最小公倍数(LCM)

两个数的最小公倍数 = 两数之积 / 最大公约数

6,素数筛法

素数,又叫质数,是只能被1或者自身两个正整数整除的正整数。

算法: 判断a 是否是素数, 就检验它能够被 2 到 n-1 整除。

优化: 只检查能够被2 到 sqrt(n) 整除

posted @ 2019-03-15 10:49  天叨哥  阅读(192)  评论(0编辑  收藏  举报