笔者参加了2023年重庆中考。
这次中考的数学比较简单,笔者如愿以偿,拿到了149分。不过笔者在填空压轴题上花了比较久的时间,因此在考完后的闲暇时间里,试图用C++解决这道题,发挥电脑特别能算的优势,暴力解决。
先看题目:
(图片不是很清晰,望谅解)
第一空十分简单,答案为4312.
第二空稍微有一点难度,答案为8165.(严谨的数学推导过程就不展示了)
下面,让我们来设计解决这道题的程序。
程序将会由三个功能组成:
1.判断一个数是否为递减数;
2.生成所有的递减数;
3.生成满足“前三个数字组成的三位数与后三个数字组成的三位数
的和能被9整除”的所有递减数.
接下来,我们一个个地实现这些功能。
1.判断一个数是否为递减数
这可以用一个bool类型的函数,输入需要判断的数(int类型,这里设它为num),返回true或者false。
bool diJianShu(int num){
}
大概就长成这个样子,需要的时候调动diJianShu这个函数就行了。
接着往里面塞代码:
如果一个数是递减数,它必须满足以下几个条件:
一、它是个四位自然数。
这意味着它要介于1000~9999之间,也就是说它不能小于1000或大于9999.
如果它小于1000或大于9999,就返回false,反之接着判断其他条件是否符合。
//判断这个数是否为四位自然数
if (num < 1000) {
return false;
}
else if (num > 9999) {
return false;
}
二、各数位上的数字均不相等;
三、各数位上的数字均不为零;
让我们先想办法获取这个四位数的各个数位上的数字。
如题,设这个四位数千位上的数字为a,百位上的数字是b,十位上的数字是c,个位上的数字是d。
根据C++的 bug 特性,两个int类型的整数数据之间做除法运算,得到的结果总还会是int类型的整数,并且这个结果是真实结果向下舍的。比如8165÷1000,C++会认为它的结果是8.
因此a就很好获取了:int a = num / 1000;
以此类推,b、c、d也很好获取。
b是第二位数字,也就是前两位组成的数字去掉第一位数字:int b = num / 100 - 10 * a;
c是第三位数字,也就是前三位组成的数字去掉第一位和第二位数字:int c