第五届蓝桥杯软件类省赛真题-C-A-3_神奇算式
2017-01-17 18:54
295 查看
/*【题目】 标题:神奇算式 由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。 比如: 210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187 都符合要求。 如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况, 一共有多少种满足要求的算式。 请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。 */ /*【解题思路】 解法一:暴力枚举 注意灵活应用数组下标和标记数组 (其中:x * y == z) 解法一:递归遍历访问 答案:12种 */ #include<iostream> #include<cstring> using namespace std; int count = 0;//此变量用于表示满足要求的算式种数 int num[10] = {0};//此数组用于表示数字0~9被用了几次,下标 0~9 用于表示数字 int visit[10] = {0};//此为备份数组用于表示数字0~9被访问了几次,下标 0~9 用于表示数字 /* * @简介:检测判断数字n是否满足各位上的数字只出现一次的条件, * 并且将各位上的数字出现次数存于num[]数组中 * @参数:n表示要检测的数字 * @返回: 满足条件返回true,否则返回false */ bool isSolution_1(int n) { do { if(num[n%10] != 0) return false; num[n%10]++; }while(n/=10); return true; } /* * @简介:检测判断数字x、y是否满足各位上的数字在num[]标记数组中都只出现一次的条件 * @参数:x、y表示要检测的数字 * @返回: 满足条件返回true,否则返回false */ bool isSolution_2(int x,int y) { do { if(visit[x%10] <= 0) return false; visit[x%10]--; }while(x /= 10); do { if(visit[y%10] <= 0) return false; visit[y%10]--; }while(y /= 10); return true; } int main() { int x,y,z;//表示算式上的三个整数:x * y == z for(z=1000;z<10000;z++) { memset(num,0,sizeof(num)); if(!isSolution_1(z)) continue; for(x=1;x<100;x++) { memcpy(visit,num,sizeof(num)); if(z % x != 0) continue; y = z/x; if(y<x)//因为x取值范围是1~100,两位数,所以另一个因子y的位数必将大于等于x continue; if(!isSolution_2(x,y)) continue; count++; cout<<x<<'*'<<y<<'='<<z<<endl; } } cout<<"满足要求的算式一共有: "<<count<<" 种"<<endl; return 0; }
相关文章推荐
- 第五届蓝桥杯软件类国赛真题-C-C-2_神奇6位数
- 蓝桥杯第五届 神奇算式(字符串处理函数)
- 第五届蓝桥杯 软件类省赛真题 第六题:李白打酒
- 第五届蓝桥杯省赛解题报告--神奇算式
- 第五届蓝桥杯软件类省赛真题-Java高职-兰顿蚂蚁
- 第五届蓝桥杯软件类国赛真题-C-A-6_扑克序列
- 第五届蓝桥杯软件类省赛真题-Java高职-地宫取宝
- 第五届蓝桥杯软件类省赛真题 Java本科A 写日志
- 第五届蓝桥杯软件类省赛真题-Java高职-矩阵翻硬币
- 第五届蓝桥杯软件类国赛真题-C-A-2_六角幻方
- 蓝桥杯真题:(猜年龄,切面条,神奇算式)
- 第五届蓝桥杯软件类省赛真题-C-C-2_等额本金
- 第五届蓝桥杯软件类国赛真题-C-B-1_年龄巧合
- 第七届蓝桥杯软件类省赛真题-C-B-3_凑算式
- 第五届蓝桥杯 软件类省赛真题 第七题:奇怪的分式
- 第五届蓝桥杯之神奇算式
- 第五届蓝桥杯软件类省赛真题-C-C-3_猜字母
- 第五届蓝桥杯 软件类省赛真题 第八题:兰顿蚂蚁
- 算法笔记_112:第五届蓝桥杯软件类省赛真题(Java本科B组)试题解答
- 第五届蓝桥杯软件类省赛真题-C-A-1_猜年龄