天平称重(巧用三进制)

分析:对砝码的放左放右,还是不放,可以最后用1,-1,0表示,类似于二进制的1表示放,0表示不放。

           结果变化的时候利用进位的思想。当为2时接一位低位,进一位高位。

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static int n;
 
	public static void main(String[] args) {
	  Scanner sca = new Scanner(System.in);
	  n = sca.nextInt();
	  String three = Integer.toString(n, 3);
	
	  //三进制的逆字符串
      StringBuilder strBul = new StringBuilder(three);   
      int ns = strBul.length();
      System.out.println(strBul);
      
     //用字符数组存放,以便改变字符
	  char[] arr =  strBul.reverse().toString().toCharArray();
	
      //标记对应砝码是否该放,并且,放到哪边
      ArrayList<Integer> al = new ArrayList<>();
      for(int i = 0; i < ns; i ++) {
    	  if(arr[i] == '1') {
    		  al.add(0, 1);
    	  }
    	  else if(arr[i] == '2') {
    		  if(i < ns - 1) {
    			  arr[i + 1] += 1;
    			  al.add(0, -1);
    		  }
    		  else {
    			  al.add(0, -1);
    			  al.add(0, 1);
    		  }
    		  
    	  }
    	  else {
    		  al.add(0, 0);
    	  }
      }
      
      int nl = al.size();
      System.out.println("长度: " + nl + '\n' + "结果:");
      for(int i = 0; i < nl; i ++) {
    	  if(al.get(i) == 1) {
    		  System.out.println((int)Math.pow(3, nl -i - 1));
    	  }
    	  else if(al.get(i) == -1) {
    		  System.out.println(-(int)Math.pow(3, nl - i - 1));
    	  }
      }
	}

}

 运行结果:

32113
1122001101
长度: 10
结果:
19683
6561
-729
27
9
1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值