60-思考題(2)-將1到9 這九個數字分成若干個數,滿足一定的算式
阿新 • • 發佈:2019-01-25
題目
求出所有可能的以下形式的算式,每個算式中有九個數位,正好用盡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*/ }