C语言----经典问题(求进制,宏定义)

本文介绍了如何解决C语言中的经典问题,包括利用数学方法求解进制问题,如15*4=112的六进制解决方案,以及高级问题如567*456=150216的十八进制解法。此外,还详细阐述了宏定义的概念,通过实例解释了宏字符替换的工作原理,并对比了break和continue语句在循环控制中的异同点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、求几进制

问题描述:题目中给出一个非十进制的算数表达等式,若等式成立,数应为几进制。如下:

初级:问题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语句则是结束整个循环过程,不再判断执行循环的条件是否成立。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值