您的位置:首页 > 其它

由1到9的9个数组成3个3位数,且三个数成1:2:3的比例,试求出所有的组合

2012-11-23 19:10 323 查看
一个同学在做ACM,给了我一道题,题目就如标题一样。最后写出如下

/*用1到9的数,组成3个3位数,且三个数比例为1:2:3,求出所有满足条件的数*/

#include<stdio.h>
#include<stdbool.h>

int noc_1 (int n);	//返回n的百位的数字
int noc_2 (int n);	//返回n的十位的数字
int noc_3 (int n);	//返回n的个位的数字
bool check (int x,int y,int z);		//检验x y x的每个位上的数字是否相同如果都不相同返回true,否则返回false

int main(void)
{
int a,b,c;	//a b c 为3个三位数的数
int i,j,k;	//i j  k 为a的百 十 个 位的数字
int n_1,n_2,n_3;	//用n_1 n_2 n_3 来轮换a的三个位的数字
for (n_1=1;n_1<4;n_1++)
{
i=n_1;
for (n_2=1;n_2<10;n_2++)
{
if (n_2==n_1)	//如果有相同的数字 舍弃这个系列的组合
continue;
j=n_2;

for (n_3=1;n_3<10;n_3++)
{
if (n_2==n_3||n_1==n_3) //如果有相同的数字 舍弃这个系列的组合
continue;
k=n_3;
a=i*100+j*10+k;
b=a*2;
c=a*3;
if(c>999)	//如果为四位数 舍弃这个组合
continue;
if(check (a,b,c)==true)
printf("%5d%5d%5d\n",a,b,c);
}

}
}
return 0;
}

int noc_1 (int n)
{
return n/100;
}

int noc_2 (int n)
{
n=n/10;
return n%10;
}

int noc_3 (int n)
{
return n%10;
}

bool check (int x,int y,int z)
{
int a[9];
a[0]=noc_1 (x);
a[1]=noc_2 (x);
a[2]=noc_3 (x);
a[3]=noc_1 (y);
a[4]=noc_2 (y);
a[5]=noc_3 (y);
a[6]=noc_1 (z);
a[7]=noc_2 (z);
a[8]=noc_3 (z);
int i,j;
for (i=0;i<9;i++)
{
if(a[i]==0)		//b c 中可能有位上的数为0 若为0 则返回false
return false;
for(j=0;j<9;j++)
{
if(j==i)
continue;
if(a[i]==a[j])
return false;
}
}
return true;
}
编译,运行后如下所示

hyp@debian:~$ gcc -Wall shu.c
hyp@debian:~$ ./a.out
192  384  576
219  438  657
273  546  819
327  654  981
hyp@debian:~$

这个我觉的应该是有很多的算法的,我没还没看过多少算法的知识,现写成如上。

------------------------------------------20121127-------------------------------

这个不是我想出来的。确实这个简短多了,也高效多了,我进行了许多无用的思考。事实上,检验可以放到最后,一些判断也可以精简掉。哈哈,长见识了,每个人都有思维的误区,考虑的太草率了。

#include<stdio.h>
int main()
{
int a,b,c,i,j,s[9];
for (a=100;a<333;a++)
{
b=2*a;c=3*a;
s[0]=a%10;s[1]=a%100/10;s[2]=a/100;
s[3]=b%10;s[4]=b%100/10;s[5]=b/100;
s[6]=c%10;s[7]=c%100/10;s[8]=c/100;
for(i=0;i<8;i++)
{
for(j=i+1;j<9;j++)
if(s[i]==s[j]) break;
if(j<9) break;
}
if((i==8)&&(j==9))
printf("%d,%d,%d\n",a,b,c);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐