【第五届蓝桥杯】神奇算式

题目:神奇算式

    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
    比如: 

210 x 6 = 1260 
8 x 473 = 3784
27 x 81 = 2187 

    都符合要求。
    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。


答案:12


C++代码一:

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	int v[5], i;
	for(i = 1023; i <= 9876; i++ ){
		v[0] = i/1000;
		v[1] = i/10%10;
		v[2] = i/100%10;
		v[3] = i%10;
		int flag1 = 0, flag2 = 0; // 满足乘法交换律的算式算作一种,需要做个标记 
		if(v[0] != v[1] && v[0] != v[2] && v[0] != v[3] && v[1] !=v[2] && v[1] != v[3] && v[2] != v[3]){
			do{
				if(flag1 != 3 && (v[0]*100+v[1]*10+v[2])*v[3] == i){
					cout << v[0] << v[1]  << v[2] << " x " << v[3] << " = " << i <<endl;
					flag1 = 1;
				}
				else if(flag2 != 2 && (v[0]*10+v[1])*(v[2]*10+v[3]) == i){
					cout << v[0] << v[1] << " x " << v[2]  << v[3] << " = " << i <<endl;
					flag2 = 2;
				}	
				else if(flag1 != 1 && v[0]*(v[1]*100+v[2]*10+v[3]) == i){
					cout << v[0] << " x " << v[1]  << v[2] << v[3] << " = " << i <<endl;
					flag1 = 3;
				}	
			}while(next_permutation(v,v+4));			
		}
		
	}

	return 0;
} 

C++代码二:

#include <iostream>
using namespace std;

bool isOk(int result, int t1, int t2) {
	bool flag1[10] = {0}, flag2[10] = {0};
	int i, rNum[4], num[4];
	for(i = 0; i < 4; i++) { // 判断结果可有重复的数字 
		rNum[i] = result%10;
		result /= 10;	
		if(flag1[rNum[i]])
			return false;			
		flag1[rNum[i]] = true;
	}
	i = 0;
	while(t1 > 0) {
		num[i] = t1%10;
		t1 /= 10; 
		if(flag2[num[i]])
			return false;
		flag2[num[i]] = true;
		i++;
	}
	while(t2 > 0) {
		num[i] = t2%10;
		t2 /= 10; 
		if(flag2[num[i]])
			return false;
		flag2[num[i]] = true;
		i++;
	}
	if(i != 4)
		return false;
	for(i = 0; i < 10; i++)
		if(flag1[i] != flag2[i])
			return false;
	return true;
}

int main() {
	int i, j, count = 0;
	for(i = 1000; i < 10000; i++) {
		//if(i == 1260 || i == 3784 || i == 2187) // 排除题目给出的三种情况 
		//	continue;
		for(j = 1; j*j <= i; j++)
				if(!(i%j) && isOk(i, j, i/j)) {
					cout << j << " x " << i/j << " = " << i << endl;
					count++;
				}
	}
	cout << "总共有 " << count << " 种结果" << endl; 
	
	return 0;
} 


第五届蓝桥杯所有试题与部分答案

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Homilier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值