Project Euler – Problem 16

Problem 16: What is the sum of the digits of the number 2^1000?

Tried my hand at writing my own UnsignedBigInt… (tailored for this question)

import java.util.LinkedList;
import java.util.List;


class runner
{
	public static class UnsignedBigInteger{
		private List arr = new LinkedList();
		
		private void _setup(double num){
			Byte remainder = 0;
			while(num > 0){
				remainder = new Byte((byte) (num % 10));
				arr.add(remainder);
				num = (int)(num/10);
			}
			arr.add((byte)num);
		}
		private void _setup(UnsignedBigInteger num){
			for(int i=0; i 0 || pull > 0); n++){
				div = cur/10;
				int rmd = (cur%10);
				int diff = arr.get(n) - rmd - pull;
				if(diff < 0){
					diff += 10;
					pull = 1;
				}else{
					pull = 0;
				}
				
				arr.set(n, (byte)diff);
				cur = div;
			}
			if (pull != 0){
				arr = new LinkedList(); arr.add((byte) 0);
			}
		}
		
		private void _power(UnsignedBigInteger arr2){
			if(arr2.toString().equals("0")){
				arr = new LinkedList(); arr.add((byte) 1);
				return;
			}
			
			while(arr2.toString().length() > 1 || arr2.toString().charAt(0) - 48 != 1){
				arr2.subtract(1);
				UnsignedBigInteger original = this.clone();
				this.add(original);
			}
		}
		
		private void _multiply(UnsignedBigInteger arr2){
			if(arr2.toString().equals("0")){
				arr = new LinkedList(); arr.add((byte) 0);
				return;
			}
			
			UnsignedBigInteger original = this.clone();
			while(arr2.toString().length() > 1 || arr2.toString().charAt(0) - 48 != 1){
				arr2.subtract(1);
				this.add(original);
			}
		}
		
		private void _add(UnsignedBigInteger arr2){
			byte carry = 0;
			for(int n = 0; n 0){
				while(carry > 0){
					Byte remainder = new Byte((byte) (carry % 10));
					arr.add(remainder);
					carry = (byte) (carry/10);
				}
			}
		}
		
		public byte get(int i){
			return arr.get(i);
		}
		public void set(int index, byte n){
			n = (byte) (n % 10);
			if(arr.size() <= index){
				arr.add(n);
			}else{
				arr.set(index, n);
			}
		}
		
		public int length(){
			return arr.size();
		}
		public UnsignedBigInteger clone(){
			return new UnsignedBigInteger(this);
		}
		public String toString(){
			StringBuilder x = new StringBuilder();
			boolean hit = false;
			for(int i = arr.size()-1; i>-1; i--){
				byte y = arr.get(i);
				if(!hit && y==0 )continue;
				else hit = true;
				x.append(y);
			}
			if(x.length() == 0) x.append(0);
			return x.toString();
		}
	}
	
	public static void main (String[] args) throws java.lang.Exception
	{
		long time = System.currentTimeMillis();

		UnsignedBigInteger num = new UnsignedBigInteger(2);
		num.power(1000);

		double sum = 0;
		for(int i = 0; i< num.length(); i++){
			sum += num.get(i);
		}
		System.out.println(sum);
		System.out.println("time: "+(System.currentTimeMillis() - time));
	}
}