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

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值