问题 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;
}