一、进制
1、类推进制的构成
推理1:
10进制:112*221=24752
可写为:(1*10^2+1*10^1+2*10^0)*(2*10^2+2*10^1+1*10^0)=2*10^4+4*10^3+7*10^2+5*10^1+2*10^0
类推n进制:abc*bca=(a*n^2+b*n^1+c*n^0)*(b*n^2+c*n^1+a*n^0)
推理2:
从上面的10进制中我们可以得到:等式两边同时对10求余——每个乘数的个位数之积,对10求余,余数就是这两个乘数之积的个位数 ((2*1)%10=2)。
那么同理:在n进制中,等式两边同时对n求余——每个乘数的个位数之积,对n求余,余数就是这两个乘数之积的个位数。
2、实例:
a、如果在某系统中,等式15*4=112成立,则系统采用的是(A)进制。
A、6 B、7 C、8 D、9
解:利用推理2,可得(4*5)%n=2;则n=6或n=9;
使用推理1,可得(1*6^1+5)*4 = 44, 1*6^2+1*6^1+2 = 44;
(1*9^1+5)*4=56, 1*9^2+1*9^1+2=92;
b、如果在某系统中,等式567*456=150216成立,则系统采用的是(D)进制。
A、9 B、10 C、12 D、18
解:使用推理2可得(7*6)%n=6;则n=9或n=12或n=18;
使用推理1可得(5*n^2+6*n+7)*(4*n^2+5*n+6)=n^5+5*n^4+2*n^2+n+6
此时如果我们再将选项带进去一个一个试的话,将非常的麻烦,不仅耗时难算,还容易出错。
那么像遇到像这种高进制的数时,先化简,然后等式两边同除n,最后再求余。
化简得:20*n^4+49*n^3+88*n^2+71*n+42=n^5+5*n^4+2*n^2+n+6;
两边同时除以n再对n求余化简得:(71+36/n)%n=1;
解得n=18.
二、宏
1、宏就是字符替换。
实例a
#define POW(x) (x)*(x)
#define DOUBLE(x) (x)+(x)
int main()
{
printf("%d\n",POW(10+10));//400
printf("%d\n",DOUBLE(10*10)*10);//(10*10)+(10*10)*10=1100
return 0;
}
实例b
#define M(x,y,z) x*y+z
void main()
{
int a=1,b=2,c=3;
printf("%d\n",M(a+b,b+c,c+a));//a+b*b+c+c+a=12
}