如题:
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
我是刚开始直接尝试了一下暴力,(ps:当时我感觉应该不行,毕竟数太大了。但是还是试了下)
for(one = 100;one<1000;one++)
{
for(two = 1;two<10;two++)
{
for(three = 1000;three<10000;three++)
{
if(one*two == three)
{
printf("%d %d %d",one,two,three);
}
我本来试了下,结果居然能打印出来。然后,我意气风发,的吃饭去了
吃完饭回来就开始补充,无非就是如果三个数乘积相等,就该判断这些数是不是一样的了
本来好不容易编完,准备试试运行下然后debug来着,结果,答案就出来了。。
思路还是比较简单的,每一步的过程都在代码有备注,应该都可以看懂
代码如下:
#include <stdio.h>
void sort(int a[], int m)//这个函数用来给数组排序,排完之后直接对比每个对应的数就行了
{
int i = 0;
int j = 0;
int tmp = 0;
for (i = 0; i<m - 1; i++)
{
for (j = 0; j < m - i - 1; j++)
{
if (a[j]>a[j + 1])
{
tmp = a[j + 1];
a[j + 1] = a[j];
a[j] = tmp;
}
}
}
}
int main()
{
int x[4];//这个数组是给乘法等号前的四个数准备的
int y[4];//这个数组是给乘法等号后的四个数准备的
int i=0,j=0;//i用来给for循环,j是统计有多少个成功的
int one,two,three; //三个数
int one1,two1,three1;//三个数的替身
for(one = 100;one<1000;one++)
{
for(two = 1;two<10;two++)
{
for(three = 1000;three<10000;three++)
{
if(one*two == three)
{
one1 = one;two1 = two;three1 = three;//替身的作用
for(i = 0;i<3;i++)
{
x[i] = one1 % 10;
one1 /= 10;
}//把每个数都撸下来
x[4] = two;//第四个数自然就是那个一位数
for(i = 0;i<4;i++)
{
y[i] = three1%10;
three1/=10;
}
sort(x,4);//用上上面的那个函数,给他们排序
sort(y,4);
if(x[0]==y[0]&&x[1]==y[1]&&x[2]==y[2]&&x[3]==y[3])
{
j++;
}
}
}
}
}
printf("%d",j);
}
运行截图:
结果是:12