概念笔记
①数组与指针
数组与指针,可以说是两个不同的概念,但是联系却又是跟紧密。下面面有一道题:
int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(“%d,%d”,*(a+1),*(p-1));
首先a申请了5 * 4 个字节的空间,a的类型其实就是一个int*,现在来分解int *p = (int *)(&a+1);这句话。
对a取地址,即就是一个匿名的指针指向a的位置,这个指针做了一个+1的操作,即指向a的地址的下一个位置,注意a的下一个地址是20个字节以后的地址了,因为a是一个数组,需要连续的20个字节,现在将这个指针强转为一个int*赋值给p。而p-1之后,这个指针就会向后回退4个字节,从而指向了9这个位置。对于(a+1)只是对数组的首地址的指针向后移动4个字节指向了3.
②const与define
(1)define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
(2)define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,会进行类型安全检查
(3)define只是进行替换进行展开,有多少地方使用,就替换多少次,const定义的只读变量在程序运行过程中只有一份备份。
OJ编程
1、计算糖果
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。
解:这道题就是简单的三元一次的方程求解。
令 x = A - B
y = B - C
z = A + B
w = B + C
于是
(z + x)/2 = A
(w - y)/2 = C
(z - x) = (w + y)
2、进制转换
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数(2 ≤ N ≤ 16)
解:这道题其实就像是对printf中的"%d"、"%x"、"%o"等这种格式化输出一样。接到这道题要明白,满进制则进一这个概念,其实就是说二进制就是满二进一,只能用1、0来表示数,十进制就是满10进一,只能用0~9表示数字,8进制就是慢8进一,只能用0~7表示数字。因此这道题要用到的知识就是进制之间的转换,通过求余和相除。
因为题目中进制最大是16进制,因此我们用一个字符串数组来记录要表示的数字。
char carry[] = "0123456789ABCDEF";
对于一个十进制数M == 10;
对于二进制N == 2
转换时就是
string res;
while(M)
{
res += carry[M%2]
M /= N;
}
3、源代码地址
戳标题,参考源代码