2013年C++A:神奇的算式

77 篇文章 12 订阅
17 篇文章 0 订阅

三、题目:神奇的算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成.
比如:2106=1260,
8
473=3784,
27*81=2187都符合要求

如果满足乘法交换律的算式算作同一种情况,那么,一共有多少种满足?


分析思路

遇到这种数字整数计算可以想到用枚举法计算

这道题目用枚举法,需要注意到首位数字不能为0,这道题目输出结果的时候。
要注意可能会出现重复的数字,就需要在前面把具体的数字计算输出检查是否有重复的算式。还需要看算式的数字排列顺序,利用数字转化为字符串,排序后比较算式中的过程中的数字与计算结果是否一致。


代码:

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

bool check(int src,int r){
		//先转字符串,排序,比较
		string src_str,r_str;
		stringstream ss;
		ss<<src;   //将int类型的值放入输入流
		ss>>src_str; //从ss中抽取出前面插入的int类型的值,赋给string
		stringstream ss1;
		ss1<<r;
		ss1>>r_str;
		sort(r_str.begin(),r_str.end());  //已转的字符串,排序 
		sort(src_str.begin(),src_str.end());
		if(r_str==src_str){   //排序后进行比较 
			return true;
		} 
	 return false;
}
int ans;
int main(){
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			if(i!=j)
			for(int k=0;k<10;k++){
				if(k!=j&&k!=i)
				for(int m=0;m<10;m++){
					if(m!=k&&m!=j&&m!=i){ 
					int src=i*1000+j*100+k*10+m;  //ijkm四位数
					//验证
					if(j!=0){ 
						int r1=i*(j*100+k*10+m); //乘法1位乘以3位结果
						if(check(src,r1)){
							printf("%d* %d\n",i);
							ans++;
						} 
				}
						//验证 
						if(k!=0){
							int r2=(i*10+j)*(k*10+m);  //乘法2位乘以2位结果
							if(check(src,r2)){
								printf("%d*  %d\n",i*10+j,k*10+m);
								ans++;
							} 
						}
						if(m!=0){
							int r3=(i*100+j*10+k)*(k); //乘法以3位乘以1位结果
							if(check(src,r3)){
								printf("%d * %d\n",i*100+j*10+k,m);
								ans++;
							} 
						}
					} 
				}
			}
		 } 
	 } 
	cout<<ans<<" "<<endl;
	return 0;
} 




运行出来的结果有5个不符合的,有重复的
在这里插入图片描述
答案:12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值