C趣味程序百例(18)1~9分成1:2:3的三個(gè)3位數(shù)

字號(hào):

60.1~9分成1:2:3的三個(gè)3位數(shù)
     將1到9 這九個(gè)數(shù)字分成三個(gè)3位數(shù),分求第一個(gè)3位數(shù),正好是第二個(gè)3位數(shù)的二倍,是第三個(gè)3位數(shù)的三倍。問(wèn)應(yīng)當(dāng)怎樣分法。
    *問(wèn)題分析與算法設(shè)計(jì)
     問(wèn)題中的三個(gè)數(shù)之間是有數(shù)學(xué)關(guān)系的,實(shí)際上只要確定第一個(gè)三位數(shù)就可以解決問(wèn)題。
     試探第一個(gè)三位數(shù)之后,計(jì)算出另外兩個(gè)數(shù),將其分別分解成三位數(shù)字,進(jìn)行判斷后確定所試探的數(shù)是否就是答案。
     需要提醒的是:試探的初值可以是123,值是333。因?yàn)椴豢赡艹鲈摲秶?BR>    *程序與程序設(shè)計(jì)
    #include
    int ok(int t,int *z);
    int a[9];
    void main()
    {
     int m,count=0;
     for(m=123;m<=333;m++) /*試探可能的三位數(shù)*/
     if(ok(m,a)&&ok(2*m,a+3)&&ok(3*m,a+6)) /*若滿(mǎn)足題意*/
     printf("No.%d: %d %d %d\n",++count,m,2*m,3*m); /*輸出結(jié)果*/
    }
    int ok(int t,int *z) /*分解t的值,將其存入z指向的三個(gè)數(shù)組元素,若滿(mǎn)足要求返回1*/
    {
     int *p1,*p2;
     for(p1=z;p1     {
     *p1=t%10; /*分解整數(shù)*/
     t/=10;
     for(p2=a;p2     if(*p1==0||*p2==*p1)return 0; /*若重復(fù)則返回*/
     }
     return 1; /*否則返回1*/
    }
    *運(yùn)行結(jié)果
     No.1:192 384 576
     No.2:219 438 657
     No.3:273 546 819
     No.4:327 654 981
    *思考題
     求出所有可能的以下形式的算式,每個(gè)算式中有九個(gè)數(shù)位,正好用盡1到9這九個(gè)數(shù)字。
     1)○○○+○○○=○○○ (共有168種可能的組合)
     2)○×○○○○=○○○○ (共有2種可能的組合)
     3)○○×○○○=○○○○ (共有7種可能的組合)
     4)○×○○○=○○×○○○ (共有13種可能的組合)
     5)○×○○○=○×○○○○ (共有28種可能的組合)
     6)○○×○○=○×○○○○ (共有7種可能的組合)
     7)○○×○○=○○×○○○ (共有11種可能的組合)