欢迎使用CSDN-markdown编辑器

来源:互联网 发布:ios网络高级编程 pdf 编辑:程序博客网 时间:2024/05/13 02:27

2017年蓝桥杯模拟题 - 猜算式

题目是这样的![这里写图片描述](http://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这三个数的数值范围,所以答案也只有第一个输出的情况是正确的。![这里写图片描述](http://img.blog.csdn.net/20170316200818446?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlQYXRpZW56ZTIwMTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
0 0