猜算式

题目:


看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!

比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....

请编程,输出所有可能的情况!

注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要

思路:

使用穷举,晒去不符合的情况,后两个数字中必有一个大雨前两个最大的,一个小于前两个数中最小的。


#include <stdio.h>
#include <stdlib.h>
int find(char flag[],int number){           //查找数的每一位是否使用过 
    while(number>0){
        if(flag[number%10]=='1')
                return 0;
        else{
                flag[number%10]='1';
                number/=10;
        }
        
    }
    return 1;
}
int main()
{

    int i,j,k,l;
    char flag[10];         //1-9是否使用 
    
    for(i=12;i<=98;i++){                 //从最小的12开始到最大的98开始枚举 
        for(j=i+1;j<=98;j++){            
            int temp=i*j;
            for(k=12;k<i;k++){
                if(temp/k>100&&temp%k==0)                                   //三位整数 
                    {
                    for(l=1;l<10;l++)
                                 flag[l]='0';
                    flag[0]='1';
                    if(find(flag,i)&&find(flag,j)&&find(flag,k)&&find(flag,temp/k)) //确保没一个数字只是用一次 
                                        printf("%d %d %d %d\n",i,j,k,temp/k);
                    }
                }
            }
    }
    system("PAUSE");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值