I have a homework to do a decimal to binary conversation. This is the code I have:
int num = 0;
int temp = 0;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
//System.out.print(""+ num%2+ (num%2)%2);
while(num != 0) {
temp = num;
System.out.print(""+(int) temp % 2);
num = num / 2;
}
It is working fine, but it giving me the output as LSB and not as MSB.
For example:
35
110001
but I need it to be 100011.
I cannot use any function or method to reverse it. I know I can put it in an array, string or whatever and do some magic. But I can use only the while loop, modulo and print.
Any Suggestions?
Instead of starting at the bottom bit, you can start at the top bit.
int i = 35;
// find where the top bit is.
int shift = 0;
while (i >>> (shift + 1) > 0) shift++;
// print from the top bit down
while (shift >= 0)
System.out.print((i >>> shift--) & 1);
prints i = 35
100011
prints for i = -35
11111111111111111111111111011101
Numbers are really right-to-left (guess why they call it 'Arabic numerals'?). The least significant digit of a number is its last digit.
You generate binary digits from least significant to most significant. You have to store them and then print in reverse order, from most significant to least significant.
Try using a List<Integer> or an int[] for this.
Don't output each digit as you find them. Build your output incrementally and then print it at the end.
public static void main(String[] args)
{
int num = 0;
int temp = 0;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
int place = 1;
int output = 0;
while(num != 0) {
temp = num % 2;
num = num / 2;
output += (place*temp);
place *=10;
}
System.out.print(""+output);
}
You may need to modify this to handle large or negative numbers.
One work around could be as below:
int indx = 0;
if(num<0){
indx =31;
num = Integer.MAX_VALUE+num+2;
}else{
while((int)Math.pow(2, indx) <= num){
indx++;
}
indx--;//get the highest index
}
System.out.print(""+1);//print the highest bit
num = num % (int)Math.pow(2, indx);
indx--;
//print the bits right to left
for(int i = indx; i >=0; i--){
if(Math.abs(num)<2){
System.out.print(""+num);
}else if((int)Math.pow(2, i) >= num){
System.out.print(""+0);
}else{
num = num % (int)Math.pow(2, i); //get the remaining value
System.out.print(""+1);
}
}
Related
The task is to generate with one loop and the modulo-operator the following pattern.
12345
23451
34512
45123
51234
I do have a solution but i think it is not solved in a good way.
So i am looking for a more elegant way to solve the problem, without hurting the requirements.
class Test{
public static void main(String[] args){
int num = 12345;
System.out.println(num);
for(int i = 0; i < 4; i++){
int tmp = num%10000+21106+i;
System.out.println(tmp);
}
}
}
You need to extract the first (most significant) digit with / 10000 and the remaining digits with % 10000. Then you can construct the next number in the series.
public static void main(String[] args){
int num = 12345;
System.out.println(num);
for(int i = 0; i < 4; i++) {
int first = num / 10000;
int last4 = num % 10000;
num = last4 * 10 + first;
System.out.println(num);
}
}
Eran's answer is correct, but hardcodes the order of the number (it will only work for numbers in the range 10000-99999). But, we can generalize it by noting that the length of a number (in decimal) is equal to the log10 of the number. Something like
int num = 123456;
System.out.println(num);
int log10 = (int) Math.log10(num);
for (int i = 0; i < log10; i++) {
int pow10 = (int) Math.pow(10, log10);
int first = num / pow10;
int last4 = num % pow10;
num = last4 * 10 + first;
System.out.println(num);
}
I have an int that ranges from 0-99. I need to get two separate ints, each containing one of the digits. I can't figure out how to get the second digit. (from 64 how to get the 6) This is my code:
public int getNumber(int pos, boolean index){//if index = 1 - first digit, if index = 0 - second digit
int n;
if(index){
n = pos%10;
}else{
if(pos<10){
n=0;
}else{
//????
}
}
return n;
}
You can do integer division by 10. For example, in the following code res should equal 4:
int res = 42 / 10;
Simply divide by 10.
...
if(index) {
n = pos/10;
}
...
Simple: in order to get any leading digit; just create a loop; and during each run, divide by 10.
In your case, you can even omit the loop ;-)
you can do:
if(index){
return x % 10;
}
return x / 10;
or maybe a little something
public int getNumber(....){
return index ? x % 10 : x / 10;
}
Just divide the number by 10. If it's int, the result will be int.
class Main {
public static void main(String[] args) {
int a = 8;
int b = 28;
int c = 99;
System.out.println(a / 10);
System.out.println(b / 10);
System.out.println(c / 10);
}
}
Here is a trick. Replace your //???? with below code.
Integer posInt= new Integer(pos);
n=Integer.parseInt( posInt.toString().substring(0, 1));
Complete code should look like,
public int getNumber(int pos, boolean index){//if index = 1 - first digit, if index = 0 - second digit
int n;
if(index){
n = pos%10;
}else{
if(pos<10){
n=0;
}else{
Integer posInt= new Integer(pos);
n=Integer.parseInt( posInt.toString().substring(0, 1));
}
}
return n;
}
Scanner scan = new Scanner(System.in);
System.out.println("Give a number");
int n = scan.nextInt();
int secondNumber = 0;
while (n > 9) {
secondNumber= n % 10;
n /= 10;
}
to find the first number you need to add to while a constant = n/10; (firstNumber = n / 10;)
Given two non-negative numbers num1 and num2 represented as strings, return the sum of num1 and num2.
The length of both num1 and num2 is less than 5100.
Both num1 and num2 contain only digits 0-9.
Both num1 and num2 do not contain any leading zeros.
You must not use any built-in BigInteger library or convert the inputs to integer directly.
I tried my solution but it doesn't work. Suggestions?
public class Solution {
public String addStrings(String num1, String num2) {
double multiplier = Math.pow(10, num1.length() - 1);
int sum = 0;
for (int i = 0; i < num1.length(); i++){
sum += ((((int) num1.charAt(i)) - 48) * multiplier);
multiplier /= 10;
}
multiplier = Math.pow(10, num2.length() - 1);
for (int i = 0; i < num2.length(); i++){
sum += ((((int) num2.charAt(i)) - 48) * multiplier);
multiplier /= 10;
}
return "" + sum;
}
}
You must not use any built-in BigInteger library or convert the inputs to integer directly.
Note that you are adding two integers of up to 5100 digits each. That is not that max value, but the max number of digits.
An int (your sum variable) cannot hold values like that. BigInteger can, but you're not allowed to use it.
So, add the numbers like you would on paper: Add last digits, write lower digit of the sum as last digit of result, and carry-over a one if needed. Repeat for second-last digit, third-last digit, etc. until done.
Since the sum will be at least the number of digits of the longest input value, and may be one longer, you should allocate a char[] of length of longest input plus one. When done, construct final string using String(char[] value, int offset, int count), with an offset of 0 or 1 as needed.
The purpose of this question is to add the numbers in the string form. You should not try to convert the strings to integers. The description says the length of the numbers could be up to 5100 digits. So the numbers are simply too big to be stored in integers and doubles. For instance In the following line:
double multiplier = Math.pow(10, num1.length() - 1);
You are trying to store 10^5100 in a double. In IEEE 754 binary floating point standard a double can a store number from ±4.94065645841246544e-324 to ±1.79769313486231570e+308. So your number won't fit. It will instead turn into Infinity. Even if it fits in double it won't be exact and you will encounter some errors in your follow up calculations.
Because the question specifies not to use BigInteger or similar libraries you should try and implement string addition yourself.
This is pretty straightforward just implement the exact algorithm you follow when you add two numbers on paper.
Here is working example of adding two strings without using BigInteger using char array as intermediate container. The point why double can't be used has been explained on #Tempux answer. Here the logic is similar to how adding two numbers on paper works.
public String addStrings(String num1, String num2) {
int carry = 0;
int m = num1.length(), n = num2.length();
int len = m < n ? n : m;
char[] res = new char[len + 1]; // length is maxLen + 1 incase of carry in adding most significant digits
for(int i = 0; i <= len ; i++) {
int a = i < m ? (num1.charAt(m - i - 1) - '0') : 0;
int b = i < n ? (num2.charAt(n - i - 1) - '0') : 0;
res[len - i] = (char)((a + b + carry) % 10 + '0');
carry = (a + b + carry) / 10;
}
return res[0] == '0' ? new String(res, 1, len) : new String(res, 0, len + 1);
}
This snippet is relatively small and precise because here I didn't play with immutable String which is complicated/messy and yield larger code. Also one intuition is - there is no way of getting larger output than max(num1_length, num2_length) + 1 which makes the implementation simple.
You have to addition as you do on paper
you can't use BigInteger and the String Length is 5100, so you can not use int or long for addition.
You have to use simple addition as we do on paper.
class AddString
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 = "98799932345";
String s2 = "99998783456";
//long n1 = Long.parseLong(s1);
//long n2 = Long.parseLong(s2);
System.out.println(addStrings(s1,s2));
//System.out.println(n1+n2);
}
public static String addStrings(String num1, String num2) {
StringBuilder ans = new StringBuilder("");
int n = num1.length();
int m = num2.length();
int carry = 0,sum;
int i, j;
for(i = n-1,j=m-1; i>=0&&j>=0;i--,j--){
int a = Integer.parseInt(""+num1.charAt(i));
int b = Integer.parseInt(""+num2.charAt(j));
//System.out.println(a+" "+b);
sum = carry + a + b;
ans.append(""+(sum%10));
carry = sum/10;
}
if(i>=0){
for(;i>=0;i--){
int a = Integer.parseInt(""+num1.charAt(i));
sum = carry + a;
ans.append(""+(sum%10));
carry = sum/10;
}
}
if(j>=0){
for(;j>=0;j--){
int a = Integer.parseInt(""+num2.charAt(j));
sum = carry + a;
ans.append(""+(sum%10));
carry = sum/10;
}
}
if(carry!=0)ans.append(""+carry);
return ans.reverse().toString();
}
}
You can run the above code and see it works in all cases, this could be written in more compact way, but that would have been difficult to understand for you.
Hope it helps!
you can use this one that is independent of Integer or BigInteger methods
public String addStrings(String num1, String num2) {
int l1 = num1.length();
int l2 = num2.length();
if(l1==0){
return num2;
}
if(l2==0){
return num1;
}
StringBuffer sb = new StringBuffer();
int minLen = Math.min(l1, l2);
int carry = 0;
for(int i=0;i<minLen;i++){
int ind = l1-i-1;
int c1 = num1.charAt(ind)-48;
ind = l2-i-1;
int c2 = num2.charAt(ind)-48;
int add = c1+c2+carry;
carry = add/10;
add = add%10;
sb.append(add);
}
String longer = null;
if(l1<l2){
longer = num2;
}
else if(l1>l2){
longer = num1;
}
if(longer!=null){
int l = longer.length();
for(int i=minLen;i<l;i++){
int c1 = longer.charAt(l-i-1)-48;
int add = c1+carry;
carry = add/10;
add = add%10;
sb.append(add);
}
}
return sb.reverse().toString();
}
The method takes two string inputs representing non-negative integers and returns the sum of the integers as a string. The algorithm works by iterating through the digits of the input strings from right to left, adding each digit and any carryover from the previous addition, and appending the resulting sum to a StringBuilder. Once both input strings have been fully processed, any remaining carryover is appended to the output string. Finally, the string is reversed to produce the correct output order.
Hope this will solve the issue.!
public string AddStrings(string num1, string num2)
{
int i = num1.Length - 1, j = num2.Length - 1, carry = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0 || carry != 0) {
int x = i >= 0 ? num1[i--] - '0' : 0;
int y = j >= 0 ? num2[j--] - '0' : 0;
int sum = x + y + carry;
sb.Append(sum % 10);
carry = sum / 10;
}
char[] chars = sb.ToString().ToCharArray();
Array.Reverse(chars);
return new string(chars);
}
Previous solutions have excess code. This is all you need.
class ShortStringSolution {
static String add(String num1Str, String num2Str) {
return Long.toString(convert(num1Str) + convert(num2Str));
}
static long convert(String numStr) {
long num = 0;
for(int i = 0; i < numStr.length(); i++) {
num = num * 10 + (numStr.charAt(i) - '0');
}
return num;
}
}
class LongStringSolution {
static String add(String numStr1, String numStr2) {
StringBuilder result = new StringBuilder();
int i = numStr1.length() - 1, j = numStr2.length() - 1, carry = 0;
while(i >= 0 || j >= 0) {
if(i >= 0) {
carry += numStr1.charAt(i--) - '0';
}
if(j >= 0) {
carry += numStr2.charAt(j--) - '0';
}
if(carry > 9) {
result.append(carry - 10);
carry = 1;
} else {
result.append(carry);
carry = 0;
}
}
if(carry > 0) {
result.append(carry);
}
return result.reverse().toString();
}
}
public class Solution {
static String add(String numStr1, String numStr2) {
if(numStr1.length() < 19 && numStr2.length() < 19) {
return ShortStringSolution.add(numStr1, numStr2);
}
return LongStringSolution.add(numStr1, numStr2);
}
}
For the sake of comprehension of the question
your method's name is addition
you are trying to do a power operation but the result is stored in a variable named multiplication...
there is more than one reason why that code doesnt work...
You need to do something like
Integer.parseInt(string)
in order to parse strings to integers
here the oficial doc
Here in I want the Stringbuilder to append the result of each calculation.
But its not coming in the correct format.
In the code I am trying to find all the comman factors of two numbers and getting the kth value. But my result is not coming in the expected format.
Expected Correct Output
4
1
No candy today
And what I am getting is this :-
4
4
1
4
1
No candy today
I need to use StringBuilder so as to fast process the output. Instead of calling the System.out each time I need to call it only once.
import java.util.*;
class TestClass {
public static void main(String args[] ) throws Exception {
StringBuilder sb = new StringBuilder();
Scanner scan = new Scanner(System.in);
int D = scan.nextInt();
int x = 0, y = 0, k = 0;
List<Integer> commonDivisor = new ArrayList<Integer>();
while(D-->0){
commonDivisor.clear();
x = scan.nextInt();
y = scan.nextInt();
k = scan.nextInt();
k = k - 1;
commonDivisor = getCommonDivisor(x, y);
Collections.reverse(commonDivisor);
if(k >= (commonDivisor.size())){
sb.append("\nNo candy today");
}else if(k <= (commonDivisor.size() - 1)){
sb.append(commonDivisor.get(k) + "\n");
}
System.out.println(sb);
}
}
public static List<Integer> getCommonDivisor(int num1, int num2) {
List<Integer> list = new ArrayList<Integer>();
int min = minimum(num1, num2);
for(int i = 1; i <= min / 2; i++) {
if (num1 % i == 0 && num2 % i == 0) {
list.add(i);
}
}
if (num1 % min == 0 && num2 % min == 0) {
list.add(min);
}
return list;
}
public static int minimum(int num1, int num2) {
return num1 <= num2 ? num1 : num2;
}
}
You're printing the string builder inside every loop iteration, so you print all the steps. Since you want to avoid printing inside the loop and instead build a string that you print at the very end you should move the print statement outside of the loop:
while(D-->0){
commonDivisor.clear();
x = scan.nextInt();
y = scan.nextInt();
k = scan.nextInt();
k = k - 1;
commonDivisor = getCommonDivisor(x, y);
Collections.reverse(commonDivisor);
if (k >= commonDivisor.size()) {
sb.append("\nNo candy today");
} else if (k <= (commonDivisor.size() - 1)){
sb.append(commonDivisor.get(k) + "\n");
}
}
System.out.println(sb);
You need to either clear your stringBuilder once its done for a test case or you should print after processing all the test cases. You already hold that and print it in while loop after every test case. So two ways to resolve the issue:
}//while loop ends
System.out.println(sb);//this is what i would prefer
Or
while(D-->0){
sb = new StringBuilder();
...
Write this line outside while loop. Rest seems OK.
System.out.println(sb);
My program should convert decimal numbers to binary. For big numbers it is giving me a negative number not a binary number. Why is this?
For example, if I supply 2321 I get 100100010001, which is fine. But if I supply
241242141 I get -2127232070093227171.
I can't use strings, arrays, functions. There is another option without define it as string? the output?
import java.util.Scanner;
public class d {
public static void main(String[] args) {
long num = 0;
long temp = 0L;
Scanner sc = new Scanner(System.in);
num = sc.nextLong();
long place = 1L;
long output = 0;
//System.out.print(""+ num%2+ (num%2)%2);
while(num != 0) {
temp = num % 2;
num = num / 2;
output += (place*temp);
place *=10;
}
System.out.print(""+output);
}
}
You problem is here
output += (place*temp);
place *=10;
this is producing a number which overflows.
A simple alternative is to create a String instead of generating a number you will convert to a String anyway.
StringBuilder output = new StringBuilder();
while(num != 0) {
output.append(num & 1);
num >>>= 1;
}
System.out.print(output.reverse());
or even
StringBuilder output = new StringBuilder();
for(long num = sc.netLong(); num != 0; num >>>= 1)
output.append(num & 1);
System.out.print(output.reverse());
If you want to use no functions except input or output.
long num = 241242141;
int shift = 63;
while (num >>> shift == 0 && shift > 0) shift--;
for (; shift >= 0; shift--)
System.out.print((num >>> shift) & 1);
// for comparison only
System.out.println("\n"+Long.toBinaryString(num));
prints
1110011000010001000000011101
1110011000010001000000011101
The problem is that, you are storing your Binary Equivalent in a long type, which cannot store such a long values.
You should rather use a StringBuilder and append your remainder - temp in it.
Then print it in reverse: -
StringBuilder builder = new StringBuilder();
while(num != 0) {
temp = num % 2;
num = num / 2;
builder.append(temp);
output += (place*temp);
place *=10;
}
System.out.println(builder.reverse());
If you don't need to use any methods, then just use String Concatenation, and then a loop to print the string in reverse: -
String builder = "";
while(num != 0) {
temp = num % 2;
num = num / 2;
builder += temp;
output += (place*temp);
place *=10;
}
for (int i = builder.length() - 1; i >= 0; i--) {
System.out.print(builder.charAt(i));
}
But, beware, this will create a large number of String objects on Heap. Also, here you are using a charAt method, that you have to use.
With recursion:
public class d {
static void toBinaryString( long number )
{
if( number > 1 ) toBinaryString( number / 2L );
System.out.print( number % 2L );
}
public static void main(String[] args) {
long num = 241242141L;
System.out.println( Long.toBinaryString( num ));
toBinaryString( num );
}
}
The ouput:
1110011000010001000000011101
1110011000010001000000011101