蓝桥杯 神奇算式
2015-03-10 20:56
190 查看
问题 C: 神奇算式
时间限制: 1 Sec 内存限制: 128 MB
题目描述
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
输入
输出
样例输入
样例输出
提示
分析:1、简单的判定位数问题。
2、枚举的思路。
3、分为1位数乘以3位数和2位数乘以2位数(另外一种思路是先枚举乘积的4位数,然后除以2位数,最后进行判断)。
4、判断是否每一位数是否不同,乘积的结果是否为原来的四个数。
LANGUAGE:C++
CODE:
#include <iostream> #define MAX_N 1005 using namespace std; bool judge1(int n) //判断两个数的乘积是否为4位数 { int ans=0; while(n) { ans++; n/=10; } if(ans==4) return true; return false; } bool judge2(int i,int j) //判断乘积的数是否为原来的四个数 { int s1=0,s2=0; //和 int ss1=1,ss2=1; //积 int tmp=i*j; bool flag1=true,flag2=true; while(tmp) { s1+=tmp%10; if(tmp%10==0) flag1=false; else ss1*=tmp%10; tmp/=10; } while(j) { s2+=j%10; if(j%10!=0) ss2*=j%10; else flag2=false; j/=10; } while(i) { s2+=i%10; if(i%10!=0) ss2*=i%10; else flag2=false; i/=10; } if(s1==s2&&ss1==ss2&&flag1&&flag2) //如果没有0的话,是否乘积和和都相等 return true; else if((!flag1&&!flag2)&&s1==s2&&ss1==ss2) //如果有0的话,是否乘积都相等 return true; return false; } bool judge3(int i,int j) //判断两个数中是否全是不同的数 { int a[4]; int ans=0; while(i) { a[ans]=i%10; i/=10; ans++; } while(j) { a[ans]=j%10; j/=10; ans++; } for(i=0;i<3;i++){ for(j=i+1;j<4;j++) if(a[i]==a[j]) //如果有相等的话返回false return false; } return true; } int main() { //freopen("data.txt","r",stdin); int i,j; int ans=0; for(i=1;i<10;i++){ //一位数乘以三位数 for(j=123;j<1000;j++){ if(judge1(i*j)&&judge2(i,j)&&judge3(i,j)) ans++; } } for(i=10;i<100;i++){ //两位数乘以两位数 for(j=i+1;j<100;j++){ if(judge1(i*j)&&judge2(i,j)&&judge3(i,j)) ans++; } } cout<<ans; return 0; }