题面
KY266
设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)。求N的值
KY15
设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
两道题均有一个共同的特点,即对数字进行枚举。在进行解答时,发现有两种不同的思路均可用于该类型的题目。
1.按位枚举数字
- ky266 代码
#define num(q,w,e,r) (q*1000+w*100+e*10+r)
#define reverse_num(q,w,e,r) (r*1000+e*100+w*10+q)
#define erate_from0_to_9(k) for(int k=0;k<=9;k++)
#define erate_from1_to_9(k) for(int k=1;k<=9;k++)
int main() {
int a,b,c,d;
erate_from1_to_9(a)
erate_from0_to_9(b)
erate_from0_to_9(c)
erate_from0_to_9(d)
if (num(a, b, c, d)*9 == reverse_num(a, b, c, d))
printf("%d%d%d%d\n", a,b,c,d);
return 0;
}
- ky15代码
int main() {
int a, b, c;
for (int a=0; a<=9; a++){
for (int b=0;b<=9;b++){
for (int c=0;c<=9;c++){
if (a*100+b*10+c + b*100+c*10+c == 532)
printf("%d %d %d\n", a,b,c);
}
}
}
return 0;
}
2.整体枚举数字
- ky266 代码
#include <stdio.h>
int reverse_num(int k){
int rvs_k=0;
while (k != 0){
rvs_k *= 10;
rvs_k += k%10;
k /= 10;
}
return rvs_k;
}
int main() {
for (int i=1000; i<=9999; i++){
if (i * 9 == reverse_num(i))
printf("%d\n",i);
}
return 0;
}
- ky15代码
#define abc_to_bcc(k) ( ((k/10)%10)*100 + (k%10)*11 )
int main() {
for (int i=100; i<=999; i++){
if (i + abc_to_bcc(i) == 532) printf("%d %d %d\n", i/100, i/10%10, i%10);
}
return 0;
}
总结
- 取得个位,十位,百位等的原理?
/10
相当于右移一位, like : 201 / 10 = 20 201/10 = 20 201/10=20
%10
相当于取最后一位 , llike : 201 % 10 = 1 201\%10=1 201%10=1 - 获得一个数字的反序数?
int reverse_num(int k){
int rvs_k=0;
while (k != 0){
rvs_k *= 10;
rvs_k += k%10;
k /= 10;
}
return rvs_k;
}