题目:猜算式
你一定还记得小学学习过的乘法计算过程,比如:
273
x 15
------
1365
273
------
4095
请你观察如下的乘法算式
***
x ***
--------
***
***
***
--------
*****
星号代表某位数字,注意这些星号中,
0~9中的每个数字都恰好用了2次。
(如因字体而产生对齐问题,请参看图p1.jpg)
请写出这个式子最终计算的结果,就是那个5位数是多少?
注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。
分析
刚开始思路就错了,以为要单独处理,写了一个全排列,无奈运行时间过长
最后才发现,不用把它分开,三位放一块,两层循环就够!
#include<stdio.h>
#include<string.h>
using namespace std;
int a[6];
int fun()
{
int f[11]= {0};
for(int i=0; i<6; i++)
{
int k=0;
while(a[i])//分解判断
{
f[a[i]%10]++;
if(f[a[i]%10]>2)//如果被使用次数超过两次,说明不符合条件
return 0;
a[i]/=10;
k++;//统计位数
}
if(k<3)//如果位数少于3,也不符合条件
return 0;
}
return 1;
}
int main()
{
int i,j;
for(i=100; i<=999; i++)
for(j=100; j<=999; j++)
{
a[0]=i;
a[1]=j;
a[2] = i*(j%10); //取个位
a[3] = i*(j/10%10); //十位
a[4]= i*(j/100); //百位
a[5]=i*j;
if(fun())//满足判定条件
printf("%d\n",i*j);
}
return 0;
}