Schriftlich addieren (Zeichenketten)
Schreiben Sie eine Funktion, die zwei ganzzahlige Arrays (integer) entgegennimmt und diese schriftlich addiert. Dabei dürfen die beiden Arrays an jeder Stelle nur die Werte von 0 bis 9 enthalten.
Das Resultat ist wieder ein Array mit Werten im Bereich 0 bis 9. Das neue Array ist möglicherweise um einen Eintrag größer als das größere der beiden Eingabefelder (Übertrag). Dokumentieren Sie, ob die "Einer" durch den höchsten bzw. den niedrigsten Index dargestellt werden.
Zusatzaufgabe: Die Eingabe wie auch die Ausgabe soll ein Array mit Basistyp char (z. B. ASCII) sein. Dabei ist zu beachten, dass die Null nicht durch das Byte 0, sondern durch das ASCII-Zeichen Null ('0') dargestellt wird.
Trick: wert[i] := arr[i] - '0'
0 Kommentare
4 Lösung(en)
def addition(a,b):
a.reverse()
b.reverse()
if len(b) < len(a):
n = len(b)
m = len(a)
else:
n = len(a)
m = len(b)
c=0
li=[]
for i in range(n):
print a[i],b[i],c
li.append((a[i]+b[i]+c)%10)
if a[i]+b[i]>9:
c = 1
else:
c = 0
for i in range(m-n):
if len(b) < len(a):
li.append((a[n+i]+c)%10)
if a[n+i]+c>9:
c = 1
else:
c = 0
else:
li.append((b[n+i]+c)%10)
if b[n+i]+c>9:
c = 1
else:
c = 0
if c == 1:
li.append(1)
s=''
li.reverse()
for ziffer in li:
s=s+str(ziffer)
print s
addition([3,4,5,6,7,8],[9,9,9,9,9,9])
#1345677
addition([3,4,5,6,7,8],[9,9,9,9,9,9,9,9,9,9])
#10000345677
addition([1,1,1,1,3,4,5,6,7,8],[9,9,9,9,9,9])
#1112345677
package ch.programmieraufgaben.strings;
import java.util.Scanner;
/**
* Aufgabe 7.5
* @author Philipp Gressly (phi AT gressly DOT ch)
*/
public class SchriftlichAddieren {
public static void main(String[] args) {
new SchriftlichAddieren().top();
}
void top() {
String zahl1 = einlesen("erste Zahl" );
String zahl2 = einlesen("zweite Zahl");
String summe = addieren(zahl1, zahl2);
if(summe.length() > 1 && summe.charAt(0) == '0') {
summe = summe.substring(1);
}
System.out.println("Summe = " + summe);
}
Scanner sc = new Scanner(System.in);
String einlesen(String was) {
System.out.println("Bitte " + was + " eingeben: ");
return sc.nextLine().trim();
}
String addieren(String a, String b) {
String result = "";
int anzZiffern = Math.max(a.length(), b.length());
int uebertrag = 0;
int pos = 1; // einer
while(pos <= anzZiffern + 1) {
int zifferA = ziffer(a, pos);
int zifferB = ziffer(b, pos);
int sum = zifferA + zifferB + uebertrag;
if(sum > 9) {
uebertrag = sum / 10;
sum = sum % 10;
} else {
uebertrag = 0;
}
result = ziffer(sum) + result;
pos = pos + 1;
}
return result;
}
/**
* Ziffer aus der Zahl extrahieren
* @param zahlenString z. B. "7734"
* @param pos 1=einer, 2= zehner, 3= 100er ...
* @return ziffer als int oder 0, falls nicht genügend Ziffern
*/
int ziffer(String zahlenString, int stelle) {
// 1 -> length() - 1
// 2 -> length() - 2
int pos = zahlenString.length() - stelle;
if(pos < 0) {
return 0;
}
return zahlenString.charAt(pos) - '0';
}
String ziffer(int zahl) {
if(zahl < 1) return "0";
if(zahl > 9) return "X"; // fehler
return "" + zahl;
}
} // end of class SchriftlichAddieren
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
// $a und $b können sowohl vom typ
// Number als auch String sein
function addInWriting(a, b) {
// vorbereitung
function toNumArr(x) {
x = x.toString().split('');
for (i in x) x[i] = parseInt(x[i]);
return x;
}
function addLeadZero(arr, l) { while (arr.length < l) arr.unshift(0); }
a = toNumArr(a); b = toNumArr(b);
let len = Math.max(a.length, b.length);
addLeadZero(a, len), addLeadZero(b, len);
// das ergebnis könnte auch direkt in $b geschrieben werden,
// daher dient $result eher demonstrationszwecken oder
// der späteren grafischen aufbereitung (nicht hier)
let result = [],
carry = 0;
// kern des ganzen
for (let i = len-1; i >= 0; i--) {
let x = a[i] + b[i] + carry;
carry = Math.floor(x/10);
result.unshift((x >= 10) ? x-10 : x);
}
result.unshift(carry);
return parseInt(result.join(''));
}
//ausgabe
console.log(addInWriting(2, '2'));
console.log(addInWriting(7, 5));
console.log(addInWriting(1, 99999)); // lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// C++ 14 | VS-2022
#include <iostream>
inline const std::string add(std::string first_, std::string second_) {
const auto dif{ abs((int)first_.length() - (int)second_.length()) };
if (first_.length() > second_.length())
second_ = std::string(dif, '0') + second_;
else
first_ = std::string(dif, '0') + first_;
std::string res{ std::string(first_.length() + 1, '0') };
auto rem{ 0 };
for (size_t i{ first_.length() }; i > 0; --i) {
const auto tmp{ (first_[i - 1] - '0') + (second_[i - 1] - '0') + rem};
res[i] = (tmp % 10) + '0';
rem = tmp / 10 % 10;
}
res[0] = rem + '0';
return res;
}
int main() {
std::cout << add("123456789", "987654321") << "\n";
std::cout << add("9", "999") << "\n";
std::cout << add("1", "9") << "\n";
}
Lösung von: Jens Kelm (@JKooP)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 2 |
Schwierigkeit: | k.A. |
Webcode: | oh4f-nrsz |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |