61.1~9組成三個3位的平方數
將1、2、3、4、5、6、7、8、9九個數字分成三組,每個數字只能用一次,即每組三個數不允許有重復數字,也不許同其它組的三個數字重復,要求每組中的三位數都組成一個平方數。
*問題分析與算法設計
本問題的思路很多,這里介紹一種簡單快速的算法。
首先求出三位數中不包含0且是某個整數平方的三位數,這樣的三位數是不多的。然后將滿足條件的三位數進行組合,使得所選出的3個三位數的9個數字沒有重復。
程序中可以將尋找足條件的三位數的過程和對該三位數進行數字分解的過程結合起來。
*程序與程序注釋
#include
void main()
{
int a[20],num[20][3],b[10]; /*a:存放滿足條件的三位數*/
/*若不是10 的倍數,則分解三位數*/
/*分解該三位數中的每一個數字*/
int i,j,k,m,n,t,flag;
printf("The 3 squares with 3 different digits each are:\n");
for(j=0,i=11;i<=31;i++) /*求出是平方數的三位數*/
if(i%10!=0) /*若不是10的倍數,則分解三位數*/
{
k=i*i; /*分解該三位數中的每一個數字*/
num[j+1][0]=k/100; /*百位*/
num[j+1][1]=k/10%10; /*十位*/
num[j+1][2]=k%10; /*個位*/
if(!(num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]||
num[j+1][1]==num[j+1][2])) /*若分解的三位數字均不相等*/
a[++j]=k; /*j:計數器,統(tǒng)計已找到的滿足要求的三位數*/
}
for(i=1;i<=j-2;++i) /*從滿足條件的三位數中選出三個進行組合*/
{
b[1]=num[i][0];
b[2]=num[i][1];
b[3]=num[i][2];
for(t=i+1;t<=j-1;++t)
{
b[4]=num[t][0]; /*取第t個數的三位數字*/
b[5]=num[t][1];
b[6]=num[t][2];
for(flag=0,m=1;!flag&&m<=3;m++) /*flag:出現(xiàn)數字重復的標記*/
for(n=4;!flag&&n<=6;n++) /*判斷兩個數的數字是否有重復*/
if(b[m]==b[n])flag=1; /*flag=1:數字有重復*/
將1、2、3、4、5、6、7、8、9九個數字分成三組,每個數字只能用一次,即每組三個數不允許有重復數字,也不許同其它組的三個數字重復,要求每組中的三位數都組成一個平方數。
*問題分析與算法設計
本問題的思路很多,這里介紹一種簡單快速的算法。
首先求出三位數中不包含0且是某個整數平方的三位數,這樣的三位數是不多的。然后將滿足條件的三位數進行組合,使得所選出的3個三位數的9個數字沒有重復。
程序中可以將尋找足條件的三位數的過程和對該三位數進行數字分解的過程結合起來。
*程序與程序注釋
#include
void main()
{
int a[20],num[20][3],b[10]; /*a:存放滿足條件的三位數*/
/*若不是10 的倍數,則分解三位數*/
/*分解該三位數中的每一個數字*/
int i,j,k,m,n,t,flag;
printf("The 3 squares with 3 different digits each are:\n");
for(j=0,i=11;i<=31;i++) /*求出是平方數的三位數*/
if(i%10!=0) /*若不是10的倍數,則分解三位數*/
{
k=i*i; /*分解該三位數中的每一個數字*/
num[j+1][0]=k/100; /*百位*/
num[j+1][1]=k/10%10; /*十位*/
num[j+1][2]=k%10; /*個位*/
if(!(num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]||
num[j+1][1]==num[j+1][2])) /*若分解的三位數字均不相等*/
a[++j]=k; /*j:計數器,統(tǒng)計已找到的滿足要求的三位數*/
}
for(i=1;i<=j-2;++i) /*從滿足條件的三位數中選出三個進行組合*/
{
b[1]=num[i][0];
b[2]=num[i][1];
b[3]=num[i][2];
for(t=i+1;t<=j-1;++t)
{
b[4]=num[t][0]; /*取第t個數的三位數字*/
b[5]=num[t][1];
b[6]=num[t][2];
for(flag=0,m=1;!flag&&m<=3;m++) /*flag:出現(xiàn)數字重復的標記*/
for(n=4;!flag&&n<=6;n++) /*判斷兩個數的數字是否有重復*/
if(b[m]==b[n])flag=1; /*flag=1:數字有重復*/

