腾讯16算法 杂谈

https://i-blog.csdnimg.cn/blog_migrate/0ae19540b475d2efb17e3a68e4bdf1b3.png


题目:2. 有下图的题解,请用 C/C++ 代码来列出满足下图 0-100 内的所有答案。


分析:用a1--a9表示九个数,其中a3=9,根据图中的信息,可以列出如下六个方程,

a1+a2-9=4       (1)

a4-a5*a6=4      (2)

a7+a8-a9=4      (3)

a1+a4/a7=4      (4)

a2-a5*a8=4       (5)

9-a6-a9=4         (6) 

6个方程8个未知数,自然解不出来的,所以如果在确定2个,则另外6个就可以算出来了,那么确定那两个呢?分析上面六个式子,由方程(4)则a1<=4范围一下缩小了很多

另外由(6)a6+a9=5,则a6<=5,a9<=5;那么a6是否是另一个要确定的数呢?假设是,我们继续往下算,这样0=<a1<=4,0=<a6<=5,a2、a9很容易的由a1、a6表示,但是求其他数

的时候,我发现有a4/a7,a5*a8两项,则其结果必然是两次方程,求解比较麻烦,所以a6不能是另一个要确定的数了。二次项产生的根源是a4/a7,a5*a8所以,所以避免求解二次方程

要确定a4、a5、a7、a8中的一个又(3)式a7+a8=4+a9<=9,则a7<=9,a8<=9;

所以取固定a1,a7;则分别求得各项如下:

a2=13-a1;

a4=(4-a1)*a7;

a8=(a2-4)*(9-a7)/(a2+a4-8);

a6=9-a7-a8;

a9=5-a6;

a5=(a2-4)/a8;

若求得的某一个值不在0-100的范围内,则此时的a1,a7不满足要求,这样只需两层循环即可;

两一个重要的问题是题中未说明a1-a9是整数,所以题目应该是有无数个解得;

设a1,a7未整数,则可以算得共有27组解,其中一组全部是整数。

代码如下,改为用Java实现:

[java]  view plain copy
  1. package tengxun;  
  2.   
  3. public class Test02Numbers {  
  4.       
  5.     public static void numbers(){  
  6.         float a1,a2;  
  7.         float a3=9;  
  8.         float a4,a5,a6;  
  9.         float a7,a8,a9;  
  10.         int n=0;  
  11.         for(int i=0;i<=4;i++){  
  12.             for(int j=0;j<=9;j++){  
  13.                 a1=(float) (i/1.0);  
  14.                 a7=(float) (j/1.0);  
  15.                 a2=13-a1;  
  16.                 a4=(4-a1)*a7;  
  17.                 a8 = (a2-4)*(9-a7) / (a2+a4-8);   
  18.                 if(a8>100||a8<0)  
  19.                     continue;  
  20.                 a6=9-a7-a8;  
  21.                 if(a6>100||a6<0)  
  22.                     continue;  
  23.                 a9=5-a6;  
  24.                 if(a9>100||a9<0)  
  25.                     continue;  
  26.                 a5=(a2-4)/a8;  
  27.                 if(a5>100||a5<0)  
  28.                     continue;  
  29.                 System.out.print(a1+"\t\t");  
  30.                 System.out.print(a2+"\t\t");  
  31.                 System.out.print(a3+"\t\t");  
  32.                 System.out.println();  
  33.                 System.out.print(a4+"\t\t");  
  34.                 System.out.print(a5+"\t\t");  
  35.                 System.out.print(a6+"\t\t");  
  36.                 System.out.println();  
  37.                 System.out.print(a7+"\t\t");  
  38.                 System.out.print(a8+"\t\t");  
  39.                 System.out.print(a9+"\t\t");  
  40.                 System.out.println();  
  41.                 System.out.println("****************");  
  42.                   
  43.             }  
  44.         }  
  45.     }  
  46.     public static void main(String[] args) {  
  47.         numbers();  
  48.     }  
  49. }  

运行结果如下27组:





全部为整数的结果为:


总结一下:若全部是整数则只有一组解

2      11      9

4      1        0

2      7        5

否则有无数组解;

版权声明:本文为博主原创文章,未经博主允许不得转载。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值