1/25 神奇算式~

如题:

由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

猜你喜欢

转载自blog.csdn.net/FG_future/article/details/113132198