一、求几进制
问题描述:题目中给出一个非十进制的算数表达等式,若等式成立,数应为几进制。如下:
初级:问题1、如果在某系统中,等式15*4=112成立,则系统采用的是几进制? 答案:六进制
方法一:传统笨办法。若有选项且数值不大,可以各个代入等式尝试,统一换成选项中的进制,看等式两边是否相等。此方法效率低,且不具有普遍性。
方法二:方程法。设为n进制,得出:
(x*(n^1)+5*(n^0))*(4*(n^0))=1*(n^2)+1*(n^1)+2*(n^0) ①
化简①得:4n+20=(n^2)+n+2 ②
将式子②的两边同时对n取余得:20%n=2%n -------> 20%n=2 (2比所求进制数小) ③
20%6=2(3*6=18)
所以此系统采用的是六进制
方法三:直接取等式左边各数的最低位进行相乘,对其结果取余,再对等式右边的最低位取余。直接得出方法二的第③步,接下来的操作方法参看方法二。
高级:问题2、假设在n进制下,567*456=150216,求n的值。(A.9 B.10 C.12 D.18) 答案:D(十八进制)
方法:前半部分----与问题1的方法二相同。对于过程的文字描述,在此不予给出,具体看以下的运算过程:
原始式子参考问题1的方法二式子①得出,由于等式冗长,对打字与阅读都不方便,对此省略。 直接化简得出:
20*(n^4)+49*(n^3)+88*(n^2)+71n+42=(n^5)+5*(n^4)+(n^2)+n+6 ④
将等式④的两边同时对n取余数得: 42%n=6 ⑤
由等式⑤得出:n可能的取值为9,12,18(只能排除选项B)
后半部分----由此将等式④两边除以n,然后再对n取余数(扔高位)
71%n+42/n%n=1%n+6%n --------> 71%n+42/n%n=1 ⑥(1%n=1; 6%n=0; 所以6%n/n=0)
然后将选项里的9,12,18分别带入等式⑥里,分析哪个数能使等式⑥成立,经尝试,得出18是正确答案,所以n表示十八进制。
二、宏定义
宏就是字符替换
1、具体例子用代码形式表示出来,如下:
#include <stdio.h>
#define POW(x) (x)*(x)
#define DOUBLE(x) (x)+(x)
int main()
{
printf("%d\n",POW(10+10)); //(10+10)*(10+10)=400
printf("%d\n",DOUBLE(10*10)*10); //(10*10)+(10*10)*10=1100
return 0;
}
2、关于此知识点,例题如下:#include <stdio.h>
#define M(x,y,z) x*y+z
void main()
{
int a = 1;
int b = 2;
int c = 3;
printf("%d\n",M(a+b,b+c,c+a));
}
//output:12
答案分析:宏就是字符替换。将M(a+b,b+c,c+a)按权展开为:a+b*b+c+c+a;然后代入数值算出结果为:12
注:不可将M(a+b,b+c,c+a)展开成(a+b)*(b+c)+c+a;此为错误方法,需注意!!!
三、break语句和continue语句的异同
相同点:都是改变循环状态的。
不同点:continue语句只结束本次循环,而不是终止整个循环的执行。
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。