今天看到的两个算法题 ,第一次做这种题目,希望大家提供更好的思路!!

 

  
  
    • import java.util.ArrayList; 
    • import java.util.List; 
    •  
    • public class Test { 
    •  
    •     /** 
    •      * @param args 
    •      */ 
    •     public static void main(String[] args) { 
    •         // TODO Auto-generated method stub 
    •         /** 
    •          * 真因子算法 除了自己 所有能被自己整除的正数相加等于自己本身 
    •          */ 
    •          List<Integer> answer = new ArrayList<Integer>(); 
    •          
    •          for (int max = 10000; max > 1; max--) { 
    •          int temp[] = new int[max]; 
    •          int index = 0
    •          int result = 0
    •          for (int i = 1; i < max; i++) { 
    •          int c = max % i; 
    •          if (c == 0) { 
    •          temp[index] = i; 
    •          index++; 
    •          // System.out.println(i); 
    •          } 
    •          
    •          } 
    •          for (int i = 0; i < temp.length; i++) { 
    •          result = result + temp[i]; 
    •          } 
    •          if (result == max) { 
    •          answer.add(max); 
    •          } 
    •          // System.out.println("---------------------------------"); 
    •          } 
    •          
    •          for (int i = 0; i < answer.size(); i++) { 
    •          int num = answer.get(i); 
    •          System.out.println(num); 
    •          } 
    •          Integer[] s=answer.toArray(new Integer[0]); 
    •  
    •         /** 
    •          * 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小 
    •          */ 
    •         int n = 10
    •         int a[] = { 23133141312345667522513520 }; 
    •         int b[] = { 2124131345366175225515 }; 
    •  
    •         int totala = 0
    •         int totalb = 0
    •         int distance; 
    •  
    •         int aminIndex = 0
    •         int bminIndex = 0
    •         for (int i = 0; i < n; i++) { 
    •             totala = totala + a[i]; 
    •             totalb = totalb + b[i]; 
    •         } 
    •         boolean transform = false
    •  
    •         System.out.println("數組A的和:" + totala); 
    •         System.out.println("數組B的和:" + totalb); 
    •         distance = totala - totalb; 
    •         if (distance == 0) { 
    •             System.out.println("int a[]=int b[]"); 
    •         } else { 
    •             if (distance < 0) { 
    •                 int temp[] = a; 
    •                 a = b; 
    •                 b = temp; 
    • distance=Math.abs(distance);
    •                 transform = true
    •             } 
    •             int min = totala; 
    •  
    •             int j; 
    •             for (j = 0; j < n; j++) { 
    •                 int k = 0
    •                 while (k < n) { 
    •                     int change = a[j] - b[k]; 
    •                     if ((2 * change) == distance) { 
    •                         int temp = a[j]; 
    •                         a[j] = b[k]; 
    •                         b[k] = temp; 
    •                         break
    •                     } else { 
    •                         if (change > 0&& (Math.abs((2 * change) - distance) < min)) { 
    •                             min = Math.abs((2 * change) - distance); 
    •                             aminIndex = j; 
    •                             bminIndex = k; 
    •                         } 
    •                         k++; 
    •                     } 
    •                 } 
    •                  
    •             } 
    •  
    •             if (transform == true) { 
    •                 System.out.println("數組A中值为:" + b[bminIndex ]+",下标为"+bminIndex + 
    •                         "的数与數組B中值为:"+ a[aminIndex ]+",下标为"+aminIndex+ "的数互换,數組A与 B的差最小");                
    •             } else { 
    •                 System.out.println("數組A中值为:" + a[aminIndex ]+",下标为"+aminIndex + 
    •                         "的数与數組B中值为:"+ b[bminIndex ]+",下标为"+bminIndex+ "的数互换,數組A与 B的差最小"); 
    •             } 
    •         } 
    •  
    •     } 
    •  

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值