Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Äthiopisches Multiplizieren (Unterprogramme)

Äthiopisches Multiplizieren

Die Äthiopier hatten einen interessanten Weg gefunden, zwei große Zahlen miteinander zu multiplizieren.

Zunächst haben sie beiden Zahlen, die es zu multiplizieren galt, nebeneinander geschrieben ,z.B.:

17 x 34

Nun geht es aber etwas anders weiter, als wir das zu tun pflegen. Die linke Zahl wird nun für jede darunterliegende Zeile halbiert, Nachkommastellen werden abgeschnitten.

Die Rechte Zahl hingegen wird Zeile für Zeile verdoppelt. Dies wird so lange betrieben, bis die linke Zahl gleich 1 ist.

17    34

 8    68

 4   136 

 2   272

 1   544

Nun werden alle die Zeilen durchgestrichen, bei denen die linke Zahl gerade (also ohne Rest durch 2 teilbar) ist.

17    34

 8    -68- 

 4   -136- 

 2   -272- 

 1   544

Von den verbleibenden Zeilen werden die rechten Zahlen addiert, also:

17    34

 8    -- 

 4   --- 

 2   --- 

 1   544

     ====

     578

Und die Summe ist 578 - voilà! - zugleich das Ergebnis des Produkts aus 17 x 34.

Aufgabe: Schreiben Sie ein Programm, welches das Äthiopische Multiplizieren realisiert

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

20 Lösung(en)

#include <stdio.h>
#include <stdlib.h>

#define true 1==1
#define false !true

struct _line{
	int left, right;
	int crossedOut;
	struct _line *next;
};

typedef struct _line line;

int main(int argc, char **argv) {
	int a, b, check, sum = 0;
	line *l, *iter;

	 do {
		 printf("Geben Sie den ersten Faktor ein: ");
		 check = scanf("%d",&a);
	 }
	 while(getchar() != '\n' || check != 1);

	 do {
		 printf("Geben Sie den zweiten Faktor ein: ");
	 	 check = scanf("%d",&b);
	 }
	 while(getchar() != '\n' || check != 1);

	 printf("\n%d x %d\n----------------------------\n", a, b);

	 l = malloc(sizeof(line));
	 l->left = a;
	 l->right = b;
	 l->next = NULL;

	 iter = l;

	 while(iter->left > 1){
		 line *tmp;
		 tmp = malloc(sizeof(line));
		 a /= 2;
		 b *= 2;
		 tmp->left = a;
		 tmp->right = b;
		 tmp->next = NULL;
		 iter->next = tmp;
		 iter = iter->next;
	 }

	 iter = l;

	 while(iter != NULL){
		 printf("%d %d\n", iter->left, iter->right);
		 iter = iter->next;
	 }

	 printf("----------------------------\n");

	 iter = l;

	 while(iter != NULL){
		 if(iter->left % 2 == 0){
			 iter->crossedOut = true;
			 printf("%d -%d-\n", iter->left, iter->right);
		 }
		 else{
			 iter->crossedOut = false;
			 printf("%d %d\n", iter->left, iter->right);
		 }
		 iter = iter->next;
	 }

	 printf("----------------------------\n");

	 iter = l;

	 while(iter != NULL){
		 if(iter->crossedOut){
			 printf("%d ---\n", iter->left);
		 }
		 else{
			 printf("%d -%d-\n", iter->left, iter->right);
			 sum += iter->right;
		 }
		 iter = iter->next;
	 }

	 printf("============================\n%d\n", sum);



	 return EXIT_SUCCESS;
}

                

Lösung von: André Trobisch ()



import java.util.Scanner;

public class starter {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		//Variablen definieren
		int result = 0;

		
		//Aufforderung zu Eingabe
		System.out.println("Willkommen beim Aethiopischen rechner");	
		System.out.println("Geben sie die erste Zahl ein");
		
		//speichern der Eingabe
		int x = sc.nextInt();
		
		//mal 2 (wegen späterem Problem)
		x*=2;
		
		//Zweite Aufforderung zu Eingabe
		System.out.println("Bitte geben sie die Zweite Zahl ein");
		
		//abspeichern der eingabe
		int y = sc.nextInt();
		
		//durch 2 (wegen späterem Probmlem)
		y/=2;
		
		//Ausgabe der Zahlen
		System.out.println( x+" X "+y);
		
		
		//Während x noch nicht 1
		while(x != 1){
			
			x/= 2;
			y*= 2;
			
			//wenn x durch 2 teilbar
			if(x%2==0){
				System.out.println(x+" \t---");
			}
			
			//wenn nicht
			else{
				System.out.println(x+" \t"+y);
				
				//y addieren zu result
				result = y + result;
			}
			
		}
		
		//ausgabe des resultats
		System.out.println("\t====");
		System.out.println("\t"+result);
	}
}

                

Lösung von: Yannick .. (It-Handbook.net)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

#define STR_LEN 256

bool is_odd( uint32_t n );
uint32_t aeth_mult( uint32_t a, uint32_t b );

int main( void ) {

	char out[STR_LEN] = "";

	const uint32_t a = 17;
	const uint32_t b = 34;

	uint32_t prod = aeth_mult( a, b );

	sprintf( out, "%i x %i = %i", a, b, prod );
	puts( out );

	return EXIT_SUCCESS;

}

uint32_t aeth_mult( uint32_t a, uint32_t b ) {

	uint32_t sum = 0;

	while( a >= 1 ) {

		if( is_odd( a ) ) sum += b;
		a = a >> 1;
		b = b << 1;

	}

	return sum;

}

bool is_odd( uint32_t n ) {

	return n & 1;

}

                

Lösung von: reeman :3 (TU Ilmenau)

aethiopisches = True
 
def halbieren(x):
    return x // 2
 
def verdoppeln(x):
    return x * 2
 
def istGerade(x):
    return not x % 2
 
def ethiopier(multiplikator, multiplikand):
    if aethiopisches:
        print("Das aethiopische Multiplizieren von %i und %i" % (multiplikator, multiplikand))
    ergebnis = 0
    while multiplikator >= 1:
        if istGerade(multiplikator):
            if aethiopisches:
                print("%4i %6i ---" % (multiplikator, multiplikand))
        else:
            if aethiopisches:
                print("%4i %6i " % (multiplikator, multiplikand))
            ergebnis += multiplikand
        multiplikator = halbieren(multiplikator)
        multiplikand = verdoppeln(multiplikand)
                
    if aethiopisches:
        print("%12s" % "====")
     
    return print("%11i " % ergebnis)

if __name__ == '__main__':
    print(ethiopier(17, 34))

                

Lösung von: Houssein Fofana ()

#!/usr/bin/python3
# -*- encoding: utf-8 -*-
#
#>>>autor:       Sebastian Müller
#>>>licence:    GPL
#>>>contact:    mypythonmueller@gmail.com
#

print("Programm zum multiplizieren zweier GANZER Zahlen nach äthiopischem Vorbild.")
print
erste = 0
while not erste:
    try:
        erste = int(input("Bitte die 1.Zahl eingeben: "))
    except:
        print("Eingabe war leider nicht korrekt")

zweite = 0
while not zweite:
    try:
        zweite = int(input("Bitte die 2.Zahl eingeben: "))
    except:
        print("Eingabe war leider nicht korrekt")

ergebnis = 0
while erste > 1:
    ergebnis = ergebnis + zweite if erste % 2 == 1 else ergebnis
    erste = erste // 2
    zweite += zweite
ergebnis += zweite

print(ergebnis)


                

Lösung von: Bastian Müller ()

package ch.programmieraufgaben.iteration;

import java.util.Scanner;

/**
 * Äthiopisches Multiplizieren
 * Programmieraufgabe Web-Code:064f-kdm4
 * @version 0.1 (Jul 8, 2016)
 * @author Philipp Gressly Freimann 
 *         (philipp.gressly@santis.ch)
 */
public class AethiopischesMultiplizieren {

	public static void main(String[] args) {
		new AethiopischesMultiplizieren().top();
	}


	void top() {
		int ersteZahl  = einlesenZahl("1. Faktor");
		int zweiteZahl = einlesenZahl("2. Faktor");
		int resultat   = multipliziere(ersteZahl, zweiteZahl);
		System.out.println("Produkt: " + resultat);
	}


	int multipliziere(int a, int b) {
		int produkt = 0;
		
		while(a >= 1) {
			// Nur bei ungeraden 1. Faktoren wird zum Produkt
			// dazugezählt.
			if(ungerade(a)) {
				produkt = produkt + b;
			}
			a = a / 2;
			b = b * 2;
		}
		return produkt;
	}


	boolean ungerade(int zahl) {
		return zahl != zahl/2*2;
	}


	Scanner sc = new Scanner(System.in);
	int einlesenZahl(String frage) {
		System.out.println("Bitte " + frage + " eingeben: ");
		String in = "";
		while("".equals(in) || null == in) {
			in = sc.nextLine().trim();
			try {
				int n = Integer.parseInt(in);
				return n;
			}
			catch(NumberFormatException nfx) {
				System.out.println("Kann Zahl nicht lesen.");
			}
		}
		return 0; // this must not happen.
	}


} // end of class AethiopischesMultiplizieren
                

Lösung von: Philipp Gressly Freimann (SANTIS Training AG)

// eingabemaske
document.write(
  '<input type="number" id="a" value="17"' +
    'onchange="ethiopianMultiplicationDemo()">' +
  ' × ' +
  '<input type="number" id="b" value="34"' +
   'onchange="ethiopianMultiplicationDemo()">' +
  '<p id="out"></p>'
);

function ethiopianMultiplicationDemo() {
  var a = parseInt(document.getElementById("a").value),
      b = parseInt(document.getElementById("b").value),
      out = document.getElementById("out"),
      table = '<table><tr><th>' + a + '</th><th>' + b + '</th><th>' +
        '(' + (a * b) + ')</th></tr>',
      result = b;

  while(a > 1) {
    a = Math.floor(a / 2);
    b *= 2;
    table += '<tr><td>' + a + '</td><td>';
    if (a % 2 == 0) table += '<span style="text-decoration:line-through">' +
      b + '</span>';
    else {
      table += b;
      result += b;
    }
    table += '</td><tr>';
  }

  table += '<tr><td></td><td><b>' + result + '</b></td></tr></table>';
  out.innerHTML = table; }                                 // lissalanda@gmx.at

                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

// Äthiopischer Multiplizieren
#include <iostream>
#include <string>
using namespace std;

int main()
{
  //variablen
  int x;
  int y;
  int result=0;
  
  //aufforderung eingabe
  cout <<"Willkommen beim Aethiopischen Multiplizieren"<<endl;
  cout <<"Bitte erste Zahl eingeben"<<endl;
  cin >> x;
  
  cout <<"Bitte zweite Zahl eingeben"<<endl;
  cin >> y;
  
  //damit erste zahl angezeigt
  x*=2;
  y/=2;
  
  //starten von loop bis x = 1
  while(x!=1){
    x /= 2;
    y *=2;
    
    //teilbar durch 2
    if(x%2==0){
    cout <<x<<"\t"<<"---"<<endl;
    }
    
    //wenn nicht
    else{
    cout <<x<<"\t"<<y<<endl;   
    result +=y;
    }
  }
  
  //ausgabe des results
  cout<<"\t===="<<endl;
  cout<<"\t"<<result;
}

                

Lösung von: Yannick .. (It-Handbook.net)

using System;
using System.Collections.Generic;
using System.Linq;

namespace EthMult {
  class Program {
    static void Main() {
      Console.WriteLine(Multiply(17, 34));
      Console.ReadKey(true);
    }

    static int Multiply(int a, int b) {
      int result = 0;

      while(a > 0) {
        if(IsOdd(a)) {
          result += b;
        }

        a >>= 1;
        b <<= 1;
      }

      return result;
    }

    static bool IsOdd(int value) {
      return (value & 1) > 0;
    }
  }
}

                

Lösung von: Marcel Kapma ()

FUNCTION z_aeth_mult.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(I_ZAHL_LINKS) TYPE  INT4 DEFAULT 17
*"     REFERENCE(I_ZAHL_RECHTS) TYPE  INT4 DEFAULT 34
*"  EXPORTING
*"     REFERENCE(E_ERGEBNIS) TYPE  INT4
*"----------------------------------------------------------------------

  DATA: lt_links   TYPE TABLE OF int4,
        lt_rechts  TYPE TABLE OF int4,
        lwa_links  LIKE LINE OF lt_links,
        lwa_rechts LIKE LINE OF lt_rechts,
        lhlp_cnt  TYPE int4.

* Links Halbieren rechts verdoppeln so lange bis links nur noch 1 steht
  lwa_links = i_zahl_links.
  lwa_rechts = i_zahl_rechts.
  APPEND lwa_links TO lt_links.
  APPEND lwa_rechts TO lt_rechts.
  WHILE lwa_links > 1 .
    lwa_links = lwa_links DIV 2.
    lwa_rechts = lwa_rechts * 2.
    APPEND lwa_links TO lt_links.
    APPEND lwa_rechts TO lt_rechts.
  ENDWHILE.

* Rechts addieren wo links ohne Rest halbiert werden kann
  LOOP AT lt_links INTO lwa_links.
    lhlp_cnt = lhlp_cnt + 1.
    IF ( lwa_links MOD 2 ) <> 0.
      READ TABLE lt_rechts INTO lwa_rechts INDEX lhlp_cnt.
      e_ergebnis = e_ergebnis + lwa_rechts.
    ENDIF.
  ENDLOOP.

ENDFUNCTION.
                

Lösung von: Name nicht veröffentlicht

public class Main {

	public static int first;
	public static int second;
	public static int result;

	public static void main(String[] args) {
		if(getFirst() && getSecond() && swapIfNeeded()) {
			System.out.println("");
			getResult();
			System.out.println("");
			System.out.println("Produkt: " + result);
		}
	}

	public static boolean getFirst() {
		try {
			Scanner sc = new Scanner(System.in);
			System.out.print("1. Faktor: ");
			first = sc.nextInt();
			return true;
		} catch (InputMismatchException e) {
			System.err.println("Fehler!");
			return false;
		}
	}

	public static boolean getSecond() {
		try {
			Scanner sc = new Scanner(System.in);
			System.out.print("2. Faktor: ");
			second = sc.nextInt();
			return true;
		} catch (InputMismatchException e) {
			System.err.println("Fehler!");
			return false;
		}
	}

	public static boolean swapIfNeeded() {
		if (first == 0 && second != 0) {
			first = second;
			second = 0;
			return true;
		} else if (first == 0 && second == 0) {
			System.out.println("");
			System.out.println("Produkt: " + 0);
			return false;
		}
		return true;
	}
	
	public static void getResult() {
		while (first >= 1) {
			int length = 10 - String.valueOf(first).length();
			String replace = "";
			
			if (first % 2 != 0) {
				for (int i = 0; i < length; i++) {
					if (i == length - 1) {
						replace += "+";
					} else {
						replace += " ";
					}
				}

				System.out.println(first + replace + second);
				result += second;
			} else {
				for (int i = 0; i < length; i++) {
					replace += " ";
				}

				System.out.println(first + replace + second);
			}

			first /= 2;
			second *= 2;
		}
	}
}
                

Lösung von: Linus Götz (Lichtenberg-Gymnasium Cuxhaven)

<!DOCTYPE html>
<html>
<head><title>Aethiopisches Multiplizieren</title></head>
	<body>
		<h1>Aethiopisches Multiplizieren</h1>
		<hr>
		<p>Hier die zu multiplizierenden Zahlen eingeben<input type=number value="16" name="a" id="a">
		* <input type=number value="33" name="b" id="b"></p> <button onclick=multi()>Rechne!</button>
		<p name="line" id="line" >Hier erscheint hoffentlich die Loesung</p>
		 <script>
		var eins=0;
		var zwei=0;
		 var res=0;
		   var eins = document.getElementById("a").value;
		 var zwei =document.getElementById("b").value;
		Number.toInteger(eins);
		
		 function multi()
		 {
		  var bool = true;
		while (bool==true){
		if(eins > 1)
		{
		
		  if(eins%2==0)
		{
			eins = Math.floor(eins / 2);
			zwei = zwei * 2;
			
		}	
		else if(res == 0)
		{	
			eins /=2;
			eins= Math.floor(eins);
			zwei= Math.floor(zwei);
			res = res + zwei;
			zwei= zwei*2;

		}
		else
		{
			eins /=2;
			eins= Math.floor(eins);
			zwei= Math.floor(zwei);
			res = res + zwei;		
			zwei= zwei*2;

		}
		}else{
		 bool=false;
		 res = res + zwei;}
		 var result=document.getElementById("line");
		 result.innerHTML = res;
		 }
		 
		 }
		 
		 </script>
	 
	 </body>
 </html>
                

Lösung von: Theo Körling (Robert-Bosch-Berufskolleg)

var zahl1 = prompt("Wähle zahl1 aus!") *2;
var zahl2 = prompt("Wähle zahl2 aus!") /2;
var ergebnis = 0;
console.log(zahl1 + " und " + zahl2 + " sind die zu berechnenden Zahlen!");
console.log("-------------------")
while(zahl1 != 1) {
if(zahl1 != 1) {
  zahl1 = Math.floor(zahl1 / 2);
    zahl2 = Math.floor(zahl2 * 2);
  console.log(zahl1 + " " + zahl2);
}
if(zahl1 % 2 == 0) {
  console.log("Diese zahl Wegstreichen!")
} else {
  console.log("Diese Zahl Addieren!")
  ergebnis = ergebnis + zahl2;
}
}
console.log("-------------------")
console.log("Ergebnis: " + ergebnis);

                

Lösung von: Max Mergrun (HHG)

#!/usr/bin/python3

def aethiop(l,r):
        R = []
        while l > 0:
                if l % 2 == 1: R.append(r)
                l = l // 2
                r = r * 2
        return sum(R)

                

Lösung von: rob ert (tub)

Module EthMultiply

    Sub Main()
        Console.WriteLine(EthMultiply(17, 34))
        Console.ReadLine()
    End Sub

    Function EthMultiply(a As Integer, b As Integer) As Integer
        Dim aM As Integer = a
        Dim bM As Integer = b
        Dim aList As New List(Of Integer)
        Dim bList As New List(Of Integer)

        aList.Add(a)
        bList.Add(b)

        While aM > 1
            aM /= 2
            bM *= 2
            aList.Add(aM)
            bList.Add(bM)
        End While

        Dim newBList As New List(Of Integer)
        For i As Integer = 0 To aList.Count - 1
            If Not aList(i) Mod 2 = 0 Then
                newBList.Add(bList(i))
            End If
        Next

        Dim sum As Integer = 0
        For Each el In newBList
            sum += el
        Next

        Return sum
    End Function

End Module

                

Lösung von: Elias Zech (Autoneum CH)

'20.03.2017 - PowerBASIC 10

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG

DIM Z1 AS LONG
DIM Z2 AS LONG
DIM zw1 AS LONG
DIM zw2 AS LONG

DIM Result AS LONG

Z1 = 1200
Z2 = 13

IF Z1 MOD 2 <> 0 THEN Result += Z2

zw1 = Z1
zw2 = Z2

DO
    zw1 = INT(zw1 / 2)
    zw2 *= 2
    IF zw1 MOD 2 <> 0 THEN
        Result += zw2
    END IF
LOOP WHILE zw1 > 1

MSGBOX STR$(Z1) & " *" & STR$(Z2) & " =" & STR$(Result),,EXE.NAME$

END FUNCTION

                

Lösung von: Markus Sägesser (keine)

public class EthiopianMult {
    public static void main(String args[]){
        System.out.println(multiply(17,34));
    }

    private static int multiply(int multiplier, int multiplicand){
        int sum = multiplicand;
        while (multiplier>1){
            multiplier/=2;
            multiplicand*=2;
            if(multiplier%2!=0)
                sum+=multiplicand;
        }
        return sum;
    }
}
                

Lösung von: Hans Otto (privat)

package aethiopischesmulti;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class AethiopischesMultiplizieren {

	public static void main(String[] args) {
		Scanner inputScanner = new Scanner(System.in);
		System.out.print("Bitte Zahl a eingeben:\t"); int input1 = inputScanner.nextInt();
		System.out.print("Bitte Zahl b eingeben:\t"); int input2 = inputScanner.nextInt();
		System.out.println(calcByAethiopic(input1, input2));
	}
	
	public static int calcByAethiopic (int a, int b) {
		List<Integer> list_a = new ArrayList<Integer>();
		List<Integer> list_b = new ArrayList<Integer>();

		int sum = 0;
		for(; a>=1; a/=2, b*=2) {
			list_a.add(a);
			if( a % 2 == 1) {
				list_b.add(b);
				sum += b;
			}else{ 
				list_b.add(0);	
			}
		}
		System.out.println(list_a);
		System.out.println(list_b);
		return sum;
	}
	
}

                

Lösung von: Daniel Peters ()

public class Main {

	public static void main(String[] args) {
		
		int zahl1 = 59;
		int zahl2 = 65;
		int ergebnis;
		
		ergebnis = ethiopischesMultiplizieren(zahl1, zahl2);
		System.out.println(ergebnis);
		
	
				
	}
	public static int  ethiopischesMultiplizieren(int zahl1, int zahl2 ) {
		int ergebnis = 0;
		if(zahl1%2!=0){ ergebnis += zahl2;}	
		do {
			zahl1 /=2;
			zahl2 *=2;
			if(zahl1%2!=0){ ergebnis += zahl2;}
			
		} while (zahl1 > 1);
		
		return ergebnis;
	}
}

                

Lösung von: Name nicht veröffentlicht

<?php
# Rekrusive Methode
echo(multiply(19,25));

function multiply($x,$y,$result=0){
    if($x==1){
        return $result+$y;
    }else{
        if($x%2!=0){
            return multiply(floor($x/2),$y*2,$result+$y);
        }else{
            return multiply(floor($x/2),$y*2,$result);
        }
    }
}
                

Lösung von: Name nicht veröffentlicht

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit:
Schwierigkeit: k.A.
Webcode: 064f-kdm4
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen