有一道数学题,题目是这样的:
用 1、2、3、4、5、6、7、8、9九个数字组成三个三位数(每个数字只能用一次),使第二个数是第一个数的2倍,第三个数是第一个数的3倍.请你写出这三个数.
以下是C源码,思路来自于QQ网友 泉
编程最重要的就是思路
----------------------------------------------------------------------------
#include <stdio.h>
int main()
{
int x,i,j;
int a[10]; //统计数字0~9出现的次数
for (x=100;x*3<1000;x++)
{
j=0; //J用做判断标志
//初始化数组 重置数组
for (i=0;i<10;i++)
a[i]=0;
a[x/100]++;
a[x%100/10]++;
a[x%100%10]++; // 可以简化为 a[x%10]++;
if(a[0]!=0) continue;
for (i=0;i<10;i++)
if (a[i]>1) {
j=1;
break;
}
if (j==1) continue;
a[x*2/100]++;
a[x*2%100/10]++;
a[x*2%100%10]++; // 可以简化为 a[x*2%10]++;
if(a[0]!=0) continue;
for (i=1;i<10;i++)
if (a[i]>1) {
j=1;
break;
}
if (j==1) continue;
a[x*3/100]++;
a[x*3%100/10]++;
a[x*3%100%10]++; // 可以简化为 a[x*3%10]++;
if(a[0]!=0) continue;
for (i=1;i<10;i++)
if (a[i]>1) {
j=1;
break;
}
if (j==1) continue;
printf("%d,%d,%d ",x,x*2,x*3);
}
return 0;
}
;以上源码也可以把判断过程放在最后,只判断一次,在统计出x x*2 x*3的每个数字的使用频率后再统一进行判断.
------------------------------------------------------------------------------------------------------
以下是Java 源码: (来自QQ网友 泉)
javac test.java 编译
java test 运行
------------------------------------------------------------------------------------------------------
public class test {
public static void main(String[] args){
find();
}
public static void find(){
int[] j = null;
x: for(int i = 100; i * 3 < 1000; i++){
j = new int[10];
j[i/100]++;
j[i%100/10]++;
j[i%10]++;
j[(i<<1)/100]++;
j[(i<<1)%100/10]++;
j[(i<<1)%10]++;
j[i*3/100]++;
j[i*3%100/10]++;
j[i*3%10]++;
if(j[0] != 0){
continue;
}
for(int k=1; k < 10; k++){
if(j[k] > 1){
continue x;
}
}
System.out.printf("%d,%d,%d\n",i,i<<1,i*3);
}
}
}
以下是同一种思路的另一个分支版本的Java源码: (来自QQ网友 泉)
public class test {
public static void main(String[] args) {
find();
}
public static void find( ) {
int[] j=null;
int i=100;
while(i++*3<1000){
j = new int[10];
if(++j[i/100]<2&&++j[i%100/10]<2&&++j[i%10]<2&&++j[(i<<1)/100]<2&&++j[(i<<1)%100/10]<2&&++j[(i<<1)%10]<2&&++j[i*3/100]<2&&++j[i*3%100/10]<2&&++j[i*3%10]<2&&j[0]==0)
System.out.printf("%d,%d,%d\n", i, i << 1, i * 3); }
}
}
下面是根据上面的Java源码转换成的C源码:
#include <stdio.h>
int main( )
{
int x,i;
int a[10];
x=100;
while(x++*3<1000) // for (x=100;x*3<1000;x++)
{
//重置数组
for (i=0;i<10;i++)
a[i]=0;
if (++a[x/100]<2&&++a[x%100/10]<2&&++a[x%10]<2&&++a[x*2/100]<2&&++a[x*2%100/10]<2&&++a[x*2%10]<2&&++a[x*3/100]<2&&++a[x*3%100/10]<2&&++a[x*3%10]<2 && a[0]==0)
printf("%d %d %d\n",x,x*2,x*3);
}
return 0;
}
评论