2017年蓝桥杯模拟题 - 猜算式
题目是这样的
![这里写图片描述](https://img-blog.csdn.net/20170316201115572?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlQYXRpZW56ZTIwMTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这道题让我感到比较麻烦之处,是题中说到“0~9”每个数字都只出现了2次。后来想到了《啊哈!算法》介绍过的“桶排序”,很方便的解决了我这个问题。
桶排序简介
> **桶排序**的思想,对于一个需要排序的整型数组a,这个数组中值最大的一个元素,决定了桶的大小,每一个桶里面的值代表其下标(也就是数组a的某具体元素值)出现的次数(是不是可能会有很多很多空桶),然后再顺序输出桶的下标就可以了。例如 int a[3] = {1, 10000, 100}; 那么需要多少个桶来进行桶排序呢?那就是100001个(当然10000个也是可以的,只是希望看得更直观),所以“桶”应该这么定义:int t[100001] = {0};
所以,t[1] = 1; t[100] = 1; t[10000] = 1; 其余都是空桶,数据大的时候就浪费空间严重,还可能存在其他缺点,但这道题我利用的只是桶排序的计数功能。
只要“0~9”当中的数字出现过,那么其出现的次数自增1.所以我的ch[10]这个数组就是桶啦~
代码块
时间比较紧急,想到这个方法才顿悟,以往会使用炒鸡多的条件判断,现在用这个方法,感觉到轻松很多!
#include <stdio.h>
int main()
{
int a, b, aa, bb, cc, aaa,i;
int a1, a2, a3, b1, b2, b3, aa1,aa2,aa3, bb1,bb2,bb3, cc1,cc2,cc3, s1,s2,s3,s4,s5;
int ch[10] = {0}; //每个元素的下标代表了0~9,对应的元素值则代表出现的次数。
for(a=100; a<1000; a++)
{
for(b=100; b<1000; b++)
{
a1 = a%10; ch[a1]++;
a2 = a/10%10; ch[a2]++;
a3 = a/100%10; ch[a3]++;
b1 = b%10; ch[b1]++;
b2 = b/10%10; ch[b2]++;
b3 = b/100%10; ch[b3]++;
aa = b1 * a;
bb = b2 * a;
cc = b3 * a;
aaa = a * b;
aa1 = aa%10; ch[aa1]++;
aa2 = aa/10%10; ch[aa2]++;
aa3 = aa/100%10; ch[aa3]++;
bb1 = bb%10; ch[bb1]++;
bb2 = bb/10%10; ch[bb2]++;
bb3 = bb/100%10; ch[bb3]++;
cc1 = cc%10; ch[cc1]++;
cc2 = cc/10%10; ch[cc2]++;
cc3 = cc/100%10; ch[cc3]++;
s1 = aaa%10; ch[s1]++;
s2 = aaa/10%10; ch[s2]++;
s3 = aaa/100%10; ch[s3]++;
s4 = aaa/1000%10; ch[s4]++;
s5 = aaa/10000%10;ch[s5]++;
for(i = 0; i<10; i++)
{
if(ch[i]!=2) break;
if(i==9) printf("%d * %d\n"
"--------\n"
"%d\n%d\n%d\n"
"--------\n = %d\n"
,a, b, aa, bb, cc, aaa);
}
for(i = 0; i<10; i++)
{
ch[i] = 0;
}
}
}
return 0;
}
输出结果
> 我的程序运行后输出的答案会包含不正确的,只是因为我没有控制aa,bb, cc这三个数的数值范围,所以答案也只有第一个输出的情况是正确的。
![这里写图片描述](https://img-blog.csdn.net/20170316200818446?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlQYXRpZW56ZTIwMTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)