您的位置:首页 > 其它

蓝桥杯 神奇算式

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: