注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

一道数学题的编程解决方案 C and Java  

2013-05-18 21:41:07|  分类: C学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
有一道数学题,题目是这样的:
用 1、2、3、4、5、6、7、8、9九个数字组成三个三位数(每个数字只能用一次),使第二个数是第一个数的2倍,第三个数是第一个数的3倍.请你写出这三个数.

一道数学题的编程解决方案 C and Java - sangguowei2002 - 编程学习
 


以下是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;
}



  评论这张
 
阅读(20)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017