Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import static java.lang.System.out;
- class Test
- {
- public static void main(String[] args)
- {
- java.util.Scanner in = new java.util.Scanner (System.in);
- System.out.println("Mata in två naturliga heltal!");
- System.out.print("Tal 1: ");
- String tal1=in.next();System.out.print("Tal 2: ");
- String tal2=in.next();
- System.out.println(tal1+"\t"+tal2);
- String svar = Addition(tal1, tal2);
- System.out.println(svar);
- show(tal1, tal2, svar, '+');
- String svar2 = subtract(tal1, tal2);
- System.out.println(svar2);
- show(tal1, tal2, svar2, '-');
- }
- public static String Addition(String tal1, String tal2)
- {
- StringBuilder sBuilder = new StringBuilder(); //En stringbuilder
- int length = tal1.length();
- tal2 = matchLength(length, tal2); //Skickar iväg andra strängen för att matcha längd
- int carry = 0;
- int i = 0;
- if(tal2.length() > length) //Kollar om längden på second är längre än first.
- {
- length = tal2.length();
- tal1 = matchLength(length, tal1); //Matchar längderna
- }
- tal1 = new StringBuilder(tal1).reverse().toString(); //Vänder på strängen för en enklare while-loop
- tal2 = new StringBuilder(tal2).reverse().toString(); //-||-
- while(i < length || carry == 1) //Körs så länge i är mindre än längden och carry == 1
- {
- int temp; //Deklarerar en int för värdet som skall vara värdet av additionen
- if(i < length)
- {
- //Adderar alla värden
- temp = (tal1.charAt(i) - 48) //Genom att ta karaktärens värde i ascii minus 48 får man "rätta" värdet
- + (tal2.charAt(i) - 48)
- + carry; //Lägger till carry
- }else
- {
- temp = carry;
- }
- carry = 0;
- if(temp > 9) //Om temp är större än tio behöver vi en carry
- {
- carry = 1;
- sBuilder.append(temp % 10); //Modulus på temp med 10 och ger lägger till resten
- }else
- {
- sBuilder.append(temp);
- }
- i++;
- }
- return new StringBuilder(sBuilder.toString()).reverse().toString(); //Vänder och returnerar strängen som byggdes
- }
- public static String matchLength(int length, String tal)
- {
- StringBuilder sBuilder = new StringBuilder(); //Stringbuilder
- while(sBuilder.length() < (length - tal.length())) //Medan stringbuilders längd är mindre än längd - en av talens längder
- {
- sBuilder.append(0); //Lägg till 0or
- }
- sBuilder.append(tal); //Lägg till talet
- return sBuilder.toString(); //Returnera strängen
- }
- public static void show(String num1, String num2, String result, char operator) {
- // set an appropriate length on numbers and result
- int len1 = num1.length();
- int len2 = num2.length();
- int len = result.length();
- int maxLen = Math.max(Math.max(len1, len2), len);
- num1 = setLen(num1, maxLen - len1);
- num2 = setLen(num2, maxLen - len2);
- result = setLen(result, maxLen - len);
- // show the expression
- out.println(" " + num1);
- out.println("" + operator + "" + num2);
- for (int i = 0; i < maxLen + 2; i++) {
- out.print("-");
- }
- out.println();
- out.println(" " + result + "\n");
- }
- public static String setLen(String s, int nofSpaces) {
- StringBuilder sb = new StringBuilder(s);
- for (int i = 0; i < nofSpaces; i++)
- sb.insert(0, " ");
- return sb.toString();
- }
- public static String subtract(String num1, String num2) {
- StringBuilder diff = new StringBuilder();
- int carry = 0;
- // Prepare numbers with right format for subtraction
- int length = num1.length();
- num2 = matchLength(length, num2);
- // Make subtraction considering every single char as an int
- for (int i = num1.length() - 1; i >= 0; i--) {
- int fig1 = Character.getNumericValue(num1.charAt(i)) - carry;
- int fig2 = Character.getNumericValue(num2.charAt(i));
- int partDiff;
- if (fig1 >= fig2) {
- partDiff = fig1 - fig2;
- carry = 0;
- } else {
- partDiff = (fig1 + 10) - fig2;
- carry = 1;
- }
- diff.append(String.valueOf(partDiff));
- }
- diff.reverse();
- return diff.toString();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement