c基础————关于进制和宏的问题

一、进制

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

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值