Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
211
Task/Balanced-ternary/Java/balanced-ternary.java
Normal file
211
Task/Balanced-ternary/Java/balanced-ternary.java
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
* Test case
|
||||
* With balanced ternaries a from string "+-0++0+", b from native integer -436, c "+-++-":
|
||||
* Write out a, b and c in decimal notation;
|
||||
* Calculate a × (b − c), write out the result in both ternary and decimal notations.
|
||||
*/
|
||||
public class BalancedTernary
|
||||
{
|
||||
public static void main(String[] args)
|
||||
{
|
||||
BTernary a=new BTernary("+-0++0+");
|
||||
BTernary b=new BTernary(-436);
|
||||
BTernary c=new BTernary("+-++-");
|
||||
|
||||
System.out.println("a="+a.intValue());
|
||||
System.out.println("b="+b.intValue());
|
||||
System.out.println("c="+c.intValue());
|
||||
System.out.println();
|
||||
|
||||
//result=a*(b-c)
|
||||
BTernary result=a.mul(b.sub(c));
|
||||
|
||||
System.out.println("result= "+result+" "+result.intValue());
|
||||
}
|
||||
|
||||
|
||||
public static class BTernary
|
||||
{
|
||||
String value;
|
||||
public BTernary(String s)
|
||||
{
|
||||
int i=0;
|
||||
while(s.charAt(i)=='0')
|
||||
i++;
|
||||
this.value=s.substring(i);
|
||||
}
|
||||
public BTernary(int v)
|
||||
{
|
||||
this.value="";
|
||||
this.value=convertToBT(v);
|
||||
}
|
||||
|
||||
private String convertToBT(int v)
|
||||
{
|
||||
if(v<0)
|
||||
return flip(convertToBT(-v));
|
||||
if(v==0)
|
||||
return "";
|
||||
int rem=mod3(v);
|
||||
if(rem==0)
|
||||
return convertToBT(v/3)+"0";
|
||||
if(rem==1)
|
||||
return convertToBT(v/3)+"+";
|
||||
if(rem==2)
|
||||
return convertToBT((v+1)/3)+"-";
|
||||
return "You can't see me";
|
||||
}
|
||||
private String flip(String s)
|
||||
{
|
||||
String flip="";
|
||||
for(int i=0;i<s.length();i++)
|
||||
{
|
||||
if(s.charAt(i)=='+')
|
||||
flip+='-';
|
||||
else if(s.charAt(i)=='-')
|
||||
flip+='+';
|
||||
else
|
||||
flip+='0';
|
||||
}
|
||||
return flip;
|
||||
}
|
||||
private int mod3(int v)
|
||||
{
|
||||
if(v>0)
|
||||
return v%3;
|
||||
v=v%3;
|
||||
return (v+3)%3;
|
||||
}
|
||||
|
||||
public int intValue()
|
||||
{
|
||||
int sum=0;
|
||||
String s=this.value;
|
||||
for(int i=0;i<s.length();i++)
|
||||
{
|
||||
char c=s.charAt(s.length()-i-1);
|
||||
int dig=0;
|
||||
if(c=='+')
|
||||
dig=1;
|
||||
else if(c=='-')
|
||||
dig=-1;
|
||||
sum+=dig*Math.pow(3, i);
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
public BTernary add(BTernary that)
|
||||
{
|
||||
String a=this.value;
|
||||
String b=that.value;
|
||||
|
||||
String longer=a.length()>b.length()?a:b;
|
||||
String shorter=a.length()>b.length()?b:a;
|
||||
|
||||
while(shorter.length()<longer.length())
|
||||
shorter=0+shorter;
|
||||
|
||||
a=longer;
|
||||
b=shorter;
|
||||
|
||||
char carry='0';
|
||||
String sum="";
|
||||
for(int i=0;i<a.length();i++)
|
||||
{
|
||||
int place=a.length()-i-1;
|
||||
String digisum=addDigits(a.charAt(place),b.charAt(place),carry);
|
||||
if(digisum.length()!=1)
|
||||
carry=digisum.charAt(0);
|
||||
else
|
||||
carry='0';
|
||||
sum=digisum.charAt(digisum.length()-1)+sum;
|
||||
}
|
||||
sum=carry+sum;
|
||||
|
||||
return new BTernary(sum);
|
||||
}
|
||||
private String addDigits(char a,char b,char carry)
|
||||
{
|
||||
String sum1=addDigits(a,b);
|
||||
String sum2=addDigits(sum1.charAt(sum1.length()-1),carry);
|
||||
//System.out.println(carry+" "+sum1+" "+sum2);
|
||||
if(sum1.length()==1)
|
||||
return sum2;
|
||||
if(sum2.length()==1)
|
||||
return sum1.charAt(0)+sum2;
|
||||
return sum1.charAt(0)+"";
|
||||
}
|
||||
private String addDigits(char a,char b)
|
||||
{
|
||||
String sum="";
|
||||
if(a=='0')
|
||||
sum=b+"";
|
||||
else if (b=='0')
|
||||
sum=a+"";
|
||||
else if(a=='+')
|
||||
{
|
||||
if(b=='+')
|
||||
sum="+-";
|
||||
else
|
||||
sum="0";
|
||||
}
|
||||
else
|
||||
{
|
||||
if(b=='+')
|
||||
sum="0";
|
||||
else
|
||||
sum="-+";
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
public BTernary neg()
|
||||
{
|
||||
return new BTernary(flip(this.value));
|
||||
}
|
||||
|
||||
public BTernary sub(BTernary that)
|
||||
{
|
||||
return this.add(that.neg());
|
||||
}
|
||||
|
||||
public BTernary mul(BTernary that)
|
||||
{
|
||||
BTernary one=new BTernary(1);
|
||||
BTernary zero=new BTernary(0);
|
||||
BTernary mul=new BTernary(0);
|
||||
|
||||
int flipflag=0;
|
||||
if(that.compareTo(zero)==-1)
|
||||
{
|
||||
that=that.neg();
|
||||
flipflag=1;
|
||||
}
|
||||
for(BTernary i=new BTernary(1);i.compareTo(that)<1;i=i.add(one))
|
||||
mul=mul.add(this);
|
||||
|
||||
if(flipflag==1)
|
||||
mul=mul.neg();
|
||||
return mul;
|
||||
}
|
||||
|
||||
public boolean equals(BTernary that)
|
||||
{
|
||||
return this.value.equals(that.value);
|
||||
}
|
||||
public int compareTo(BTernary that)
|
||||
{
|
||||
if(this.intValue()>that.intValue())
|
||||
return 1;
|
||||
else if(this.equals(that))
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue