1. 程式人生 > >60-思考題(2)-將1到9 這九個數字分成若干個數,滿足一定的算式

60-思考題(2)-將1到9 這九個數字分成若干個數,滿足一定的算式

題目

求出所有可能的以下形式的算式,每個算式中有九個數位,正好用盡1到9這九個數字。
○×○○○○=○○○○ (共有2種可能的組合)

/*60.思考題(2)
求出所有可能的以下形式的算式,每個算式中有九個數位,正好用盡1到9這九個數字。
○×○○○○=○○○○ (共有2種可能的組合)
問題描述:將1到9 這九個數字分成三個數,第一個1位數和第二個4位數的乘積正好等於第三個4位數。
*問題分析與演算法設計
問題中的三個數之間是有數學關係的,實際上只要確定第一個1位數和第二個4位數就可以解決問題。
試探第一個和第二個數之後,計算出第三個數,將其分別分解成各位數字,進行判斷後確定所試探的數是否就是答案。
需要提醒的是:第二個數試探的初值可以是1234,最大值是9876。因為不可能超出該範圍。
*/

#include<iostream>
using namespace std;
int ok(int t,int *z,int bit);
int a[9];
int main()
{
	int m,n,count=0,flag=0;
	cout<<"將1到9 這九個數字分成三個數"<<endl;  
    cout<<"要求"<<endl;  
    cout<<"(1)3個數符合算式 ○×○○○○=○○○○"<<endl;  
    cout<<"(2)正好用盡1到9這九個數字,數中數字不能有重複。"<<endl;  
    cout<<"\n\n滿足條件的結果如下"<<endl;  
	for(m=1;m<=9;m++) /*試探可能的第一個數*/
      for(n=1000;n<=9999;n++) /*試探可能的第二個數*/
		{if(m*n>9999)		
		     break;
		 else
	         if(ok(m,a,1)&&ok(n,a+1,4)&&ok(m*n,a+5,4)) /*若滿足題意*/	
	             cout<<"No."<<++count<<": "<<m<<"×"<<n<<"="<<n*m<<endl;/*輸出結果*/
		}
	return 0;
}
int ok(int t,int *z,int bit)/*分解t的值,將其存入z指向的陣列元素,若滿足分解得到的各個數沒有0或者無重複返回1,其中bit表示要分解的數的個數*/    
{
	int *p1,*p2;
	for(p1=z;p1<z+bit;p1++)
	{
	*p1=t%10; /*分解整數*/
	if(*p1==0) return 0; //若分解得到0,則不符合要求,返回0    
	t/=10;
	for(p2=a;p2<p1;p2++) /*查詢分解出的數字是否已經出現過*/
	if(*p2==*p1)return 0; /*如果出現重複數字則返回0*/  
	}
	return 1; /*否則返回1*/
}