以下是我编写的一个程序,意思是通过把苹果分配给若干个箱子,然后用箱子的组合满足顾客需要购买的苹果数量。总的苹果数和顾客要购买的苹果数按实际情况输入,运行的结果发现有些数是正确而有些数并不正确,显示出来错误的数我找不出什么规律,请大家帮帮忙啦,以下是程序:import java.util.Scanner;
import java.math.*;
import java.lang.*;public class apple_acount {    public apple_acount() {
    }
    public static void main (String[] args) 
    {
     System.out.println("把苹果分配给若干个箱子,然后用箱子的组合满足顾客需要");
     int all_apples;
     System.out.print("请输入你苹果的总数:");
     Scanner aa=new Scanner(System.in);
     all_apples=aa.nextInt();
     int x=(int)(Math.log(all_apples)/Math.log(2)+1);     int[] apples_divide=new int[x];
     boolean j=true;
     int k=all_apples;
     int i=0;
    
    
if(all_apples==1)
{
 apples_divide[0]=1;

}
else if(all_apples==2)
{

apples_divide[0]=1;
apples_divide[1]=1;

}
else if(all_apples==3)
{

apples_divide[0]=2;
apples_divide[1]=1;

}
else
{
while(j)

{

apples_divide[i]=(int)Math.floor(k/2);
k=(int)Math.floor(k/2)+k%2;
if(k==2)
{
apples_divide[i+1]=1;
apples_divide[i+2]=1;
j=false;
}
else if(k==3)
{
apples_divide[i+1]=2;
apples_divide[i+2]=1;
j=false; 
    }
    
    i++;
}
           
        }
    
         System.out.println("最少要用"+(apples_divide.length)+"个箱子,分配规则如下:");
         for(int s=0;s<apples_divide.length;s++)
         {
          System.out.println("第"+(s+1)+"箱:"+apples_divide[s]);
         }
         System.out.print("请输入顾客要购买的苹果数量:");
         int box_input;
         Scanner bi=new Scanner(System.in);
         box_input=bi.nextInt();
         int e=box_input;
         
         System.out.println("需要组合的箱子是:");
         int w=0;
                
         if(box_input==1 & all_apples==1)
          {
          System.out.println("第1箱:1");
          }
         else
          {
         
         
         
          if(e<apples_divide[0])
          {
          while((w+2)<=apples_divide.length)
          {
         
          if(apples_divide[w]>e & e>=apples_divide[w+1])
          {
                    if(e==apples_divide[w+1])
          {
          System.out.println("第"+(w+2)+"箱:"+apples_divide[w+1]);
          break;
          }
          System.out.println("第"+(w+2)+"箱:"+apples_divide[w+1]);
          e=e-apples_divide[w+1];
          }
         
          w++;
          }
          }
          else if(e>=apples_divide[0])
          {
              if(e==apples_divide[0])
          {
          System.out.println("第1箱:"+apples_divide[0]);
         
          }
          else
          {
          System.out.println("第1箱:"+apples_divide[0]);
          int t=box_input-apples_divide[0];
          while((w+2)<=apples_divide.length)
         
          {
         
          if(apples_divide[w]>t & t>=apples_divide[w+1])
                  {
                        if(t==apples_divide[w+1])
              {
          System.out.println("第"+(w+2)+"箱:"+apples_divide[w+1]);
          break;
              }
              System.out.println("第"+(w+2)+"箱:"+apples_divide[w+1]);
              t=t-apples_divide[w+1];
              
                  }
                  w++;
                  }
                
                  
              }
         
           }        
         
             
          }
         
    }
         
    
}
你们运行一下试试看,谢谢啦!这是我第一次发帖

解决方案 »

  1.   


    我在这个程序输入苹果的总数为600,顾客购买的是123,下面是现实结果,没错啊
    --------------------Configuration: <Default>--------------------
    把苹果分配给若干个箱子,然后用箱子的组合满足顾客需要
    请输入你苹果的总数:600
    最少要用10个箱子,分配规则如下:
    第1箱:300
    第2箱:150
    第3箱:75
    第4箱:37
    第5箱:19
    第6箱:9
    第7箱:5
    第8箱:2
    第9箱:2
    第10箱:1
    请输入顾客要购买的苹果数量:123
    需要组合的箱子是:
    第3箱:75
    第4箱:37
    第6箱:9
    第8箱:2Process completed.
      

  2.   

    这是输入10000000的结果--------------------Configuration: <Default>--------------------
    把苹果分配给若干个箱子,然后用箱子的组合满足顾客需要
    请输入你苹果的总数:10000000
    最少要用24个箱子,分配规则如下:
    第1箱:5000000
    第2箱:2500000
    第3箱:1250000
    第4箱:625000
    第5箱:312500
    第6箱:156250
    第7箱:78125
    第8箱:39062
    第9箱:19531
    第10箱:9766
    第11箱:4883
    第12箱:2441
    第13箱:1221
    第14箱:610
    第15箱:305
    第16箱:153
    第17箱:76
    第18箱:38
    第19箱:19
    第20箱:10
    第21箱:5
    第22箱:2
    第23箱:2
    第24箱:1
    请输入顾客要购买的苹果数量:1234567
    需要组合的箱子是:
    第4箱:625000
    第5箱:312500
    第6箱:156250
    第7箱:78125
    第8箱:39062
    第9箱:19531
    第12箱:2441
    第13箱:1221
    第15箱:305
    第17箱:76
    第18箱:38
    第20箱:10
    第21箱:5
    第22箱:2
    第24箱:1Process completed.
    这是输入50的结果--------------------Configuration: <Default>--------------------
    把苹果分配给若干个箱子,然后用箱子的组合满足顾客需要
    请输入你苹果的总数:50
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
        at apple_acount.main(apple_acount.java:61)Process completed.
    帮帮忙啦,已经检查一天多了,还是找不出来
      

  3.   

    了解了 这样速度也不错 也就是一个除2求和的问题  但是如果一开始用2的n次方来做  我想更直接点  看代码:
    public class AppleAndCase {
    public static void main(String args[]){
    long appleNo = 1000l;
    int caseNo = 0;
    long appleInCase = 0l;
    long sum = 0;

    if(appleNo <= 0)
    System.out.println("脑残!");
    else if(appleNo == 1)
    System.out.println("#"+ (caseNo+1) +": "+ appleNo);
    else{
    while(Math.pow(2, caseNo+1) <= appleNo - sum){
    caseNo ++;
    appleInCase = (long)Math.pow(2, caseNo);
    System.out.println("#"+ caseNo +": "+ appleInCase);

    sum += appleInCase;
    }
    if (appleNo - sum > 0)
    System.out.println("#"+ (caseNo+1) +": "+ (appleNo - sum));
    }
    }
    }输出:
    #1: 2
    #2: 4
    #3: 8
    #4: 16
    #5: 32
    #6: 64
    #7: 128
    #8: 256
    #9: 490
      

  4.   

    自己改了下:
    public class AppleAndCase {
    public static void main(String args[]){
    long appleNo = 1000l;
    int caseNo = 0;
    long appleInCase = 0l;
    long sum = 0;

    if(appleNo <= 0)
    System.out.println("脑残!");
    else if(appleNo >= 1){                             
    System.out.println("#"+ (caseNo+1) +": "+ 1);   caseNo ++;
    sum ++;

    while(Math.pow(2, caseNo+1) <= appleNo - sum){
    appleInCase = (long)Math.pow(2, caseNo);
    caseNo ++;
    System.out.println("#"+ caseNo +": "+ appleInCase);

    sum += appleInCase;
    }
    if (appleNo - sum > 0)
    System.out.println("#"+ (caseNo+1) +": "+ (appleNo - sum));
    }
    }
    }
    输出:
    #1: 1
    #2: 2
    #3: 4
    #4: 8
    #5: 16
    #6: 32
    #7: 64
    #8: 128
    #9: 256
    #10: 489