Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Zweierpotenzen (1, 2, 4, 8, 16, 32, ...) (Datentypen, Variablen und Ausdrücke)

Schreiben Sie ein Programm, das von einer gegebenen Zahl prüft, ob es sich um eine sog. Zweierpotenz handelt.

Zweierpotenzen sind die Zahlen, die durch mehrmaliges Verdoppeln der Zahl 1 zustande kommen (1, 2, 4, 8, und so weiter).

Eingabe: ganze, positive Zahl

Ausgabe: TRUE (wahr oder 1) bei Zweierpotenzen bzw. FALSE (fasch oder 0) bei allen anderen Zahlen.

2 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (2)

gressly 28. April 2015 22:49   reply report
reeman
Übrigens stimmt die Checksumme hier nicht, 0 ist keine Potenz von 2!

Merci für den Hinweis. Ich habe die Verifikation (Checksumme) dahingehend korrigiert, dass 0 natürlich keine Zweierpotenz ist.
reeman 31. Mai 2014 12:33   reply report
Übrigens stimmt die Checksumme hier nicht, 0 ist keine Potenz von 2!

19 Lösung(en)

int isGerade(long zahl) {
  return ! (zahl & 1);
}

int is2PowRecursive(long zahl) {
  if(0 == zahl || 1 == zahl) return 1; // true
  
  return isGerade(zahl) && is2PowRecursive(zahl / 2);
}
                

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

// folgende spannende Lösung funktioniert, da 
// C (und andere Sprachen) das sog. Zweierkomplement 
// verwenden:
int is2PowBitwise(long zahl) {
  return (zahl & -zahl) == zahl;
}
                

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

int isGerade(long zahl) {
  return ! (zahl & 1);
}

int is2PowIterative(long zahl) {
  if(0 == zahl) return 1; // true
  while(isGerade(zahl)) {
    zahl = zahl / 2;
  }
  return 1 == zahl;
}
                

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

(defun zweier-potenz-p (n)
	   "True, wenn n eine Zweierpotenz ist, sonst nil (false)."
	   (if (= n 0)
	       t
	       (multiple-value-bind (quotient reminder)
		   (floor (log n 2))
		 (equalp reminder 0.0))))
                

Lösung von: Stefan Meichtry (Erwachsenenbildung)

boolean istZweierpotenz(long x) {
  double zweierLogarithmus = Math.log(x) / Math.log(2.0);
  int gerundeterZweierLogarithmus = (int) (zweierLogarithmus + 0.5); // runden
  return potenz(2, gerundeterZweierLogarithmus) == x;
}
    
long potenz(int basis, int exponent) {
   if(0 >= exponent) {
       return 1;
   }
   if(istGerade(exponent)) {
       return potenz(basis * basis, exponent / 2);
   } else {
       return basis * potenz(basis * basis, (exponent - 1) / 2);
   }
}
    
boolean istGerade(int x) {
   return 0 == x % 2;  
}
                

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

// Autor:				Andy Großhennig
// Solution for task:	Zweierpotenzen (1, 2, 4, 8, 16, 32, ...) (Datentypen, Variablen und Ausdrücke)

#include <iostream>

using namespace std;

// Function: Go through the potency of two and check whether the numbers become the same
bool checkNumber(unsigned int &iNumber, bool &bIsSquare)
{
	for(unsigned int iPower = 1;iPower <= iNumber;iPower *= 2)
	{
		if(iPower ==  iNumber) bIsSquare = true;
		else bIsSquare = false;
	}

	return bIsSquare;
}

int main()
{
	unsigned int iNumber;
	bool bIsSquare = false;
	string sResult;

	cout << "Ganze, Positive Zahl eingeben: ";
	cin >> iNumber;
	cout << "\n\n";

	bIsSquare = checkNumber(iNumber, bIsSquare);

	if(bIsSquare) sResult = "eine";
	else sResult = "keine";
	

	cout << iNumber << " ist " << sResult << " Zweierpotenz\n";

	cout << "\n\n";
	system("Pause");
	return 0;
}
                

Lösung von: Andy Großhennig (Bundeswehr)

// checks even and proof of last one
// http://www.softwareschule.ch
//
function isPowerof2(num: int64): boolean;
begin
 result:= false;
 while isEven(num) do 
   num:= num div 2;
 if num= 1 then
   result:= true;   
end;


//add on:
function powerOf2(exponent: integer): int64;
var shifter: int64;
    counter: integer;
begin
  shifter:= 1;
  for counter:= 1 to exponent do
    shifter:= shifter + shifter;
  result:= shifter;
end;

                

Lösung von: Max Kleiner (BFH)

program Zweierpotenz (input, output);
{ Programm fuer Zweierpotenz-Funtion }

    var
    pruefZahl: integer;

    function testZweierPotenz (inTestZahl: integer): boolean;
    { testet ob sich bei der Zahl um eine sog. Zweierpotenz handelt. }

        const
        DURCHLAEUFE = 14;

        type
        tIndex = 1..DURCHLAEUFE;

        var
        i: tIndex;
        Zaehler: integer;
        gefunden: boolean;

    begin
        gefunden := false;
        if (inTestZahl = 0) or (inTestZahl = 1) then
        { Sonderfall: Zahl = 0 oder 1 }
            gefunden := true
        else
        begin
            Zaehler := 1;
            i := 1;
            repeat
                Zaehler := Zaehler * 2;
                i := i + 1;
                if inTestZahl = Zaehler then
                    gefunden := true
            until (i = DURCHLAEUFE) or (Zaehler >= inTestZahl);

        end; { inTestZahl = 0 }
        testZweierPotenz := gefunden;
    end; { testZweierPotenz }

begin
    write('zu testende Zahl eingeben (max: 16.384): ');
    read(pruefZahl);
    writeln;
    writeln('Das Ergebnis ist: ', testZweierPotenz(pruefZahl));
end. { Zweierpotenz }
                

Lösung von: Patrick Reif ()

import java.util.Scanner;

public class zweiterpotenzen {

    // überprüft ob die Zahl eine Zweierpotenz ist
    private boolean ueberpruefen(int zahl) {

	// Wert der am Ende angibt ob Zweierpotenz oder nicht
	boolean zweierpotenz = true;

	// teilt so lange durch 2 bis das ergebniss 1 ist oder ein Rest entsteht
	while (zahl > 1 || zahl == 0) {

	    if (zahl % 2 != 0 || zahl == 0) {
		zweierpotenz = false;
		break;
	    }

	    zahl = zahl / 2;
	}

	return zweierpotenz;
    }

    // Hauptmethode
    public static void main(String[] args) {

	// Klassenobjekt um auf die Methode zugreifen zu können
	zweiterpotenzen tue = new zweiterpotenzen();

	// Scanner um die Zahl einzulesen
	Scanner scan = new Scanner(System.in);

	System.out.println("Geben Sie die zu ueberpruefende Zahl an:");

	// wertet das Ergebniss der Methode aus
	if (tue.ueberpruefen(scan.nextInt())) {
	    System.out.println("Ihre Zahl ist eine Zweierpotenz");
	} else {
	    System.out.println("Ihre Zahl ist keine Zweierpotenz");
	}
    }
}
                

Lösung von: Sebastian Littel ()

#!/usr/bin/env perl
#use Modern::Perl;


print "Bitte Zahl eingeben, bei der geprüft werden soll, ob es sich um eine Zweierpotenz handelt: ";
my $input = <STDIN>;
my $pow2 = 1;
my $bool = 1;

while ($input >= $pow2) {

    if ($input == $pow2) {
        print  "TRUE\n"; 
        $bool = 0;
        last;
    }
    
    else {
        $pow2 = $pow2 * 2;    
    }
    
}

if ($bool == 1) {
     print "FALSE\n"; 
}



                

Lösung von: Patricia Beier ()

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

bool is_2pow( int64_t n );
bool is_int( double n );

int main(){
	
	const int64_t i = 1024;

	printf( "%d ist ", i );
	if( ! is_2pow( i ) ) printf( "k" );
	printf( "eine 2er Potenz\n", i );
	
}

bool is_2pow( int64_t n ){

	if( n <= 0 ){
		return false;
	}
	
	double l = log( n ) / log( 2 );

	//wenn n eine Potenz von zwei ist,
	//muss der 2er - Logarithmus eine Ganzzahl sein
	return is_int( l );

}

bool is_int( double n ){

	int64_t i = (int64_t) n;
	return (n - i) == 0.0;

}
                

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

#Zweierpotenzen
keine = 'eine'
eingabe=int(input("Geben Sie eine Zahl ein: "))
if eingabe == 1:
    eingabe = 0
while eingabe > 1:
    eingabe = eingabe / 2
    modulo = eingabe % 2
    if eingabe ==1:
        keine = 'eine'
    elif modulo > 0:
        keine ='keine'
print ("Die eingegebene Zahl ist",keine,"Potenz von 2")
                

Lösung von: Name nicht veröffentlicht

function isPowerOfTwo(num) {
   while (num > 1) num /= 2;
   return (num == 1);
}

console.log(isPowerOfTwo(prompt("Geben Sie eine Zweierpotenz ein: ")));
                

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

use strict;
my $number = 0;

for(1..32){
    ++$number;
    print "$number - ".isPow2($number)."\n";
}


sub isPow2 {
    return(0) if($_[0] <= 0);
    return(1) if($_[0] == 1);
    for(1..6){
       return(1) if($_[0] == 2**$_)
    }
    return(0);
}
                

Lösung von: Paul Scheinast (http://scheinast.eu)

Module Module1
    Sub Main()
        Console.WriteLine("Geben sie eine Zahl ein: ")
        Dim x As Double = Convert.ToDouble(Console.ReadLine())

        If istGerade(x) Then
            If checkPotenz(x) Then
                Console.WriteLine("True")
            Else
                Console.WriteLine("False")
            End If
        End If

        Console.ReadLine()
    End Sub

    Public Function checkPotenz(x As Double) As Boolean
        While x > 1
            x /= 2
        End While

        If x = 1 Then
            Return True
        Else
            Return False
        End If
    End Function

    Public Function istGerade(number As Double) As Boolean
        If number Mod 2 = 0 Then : Return True : Else : Return False : End If
    End Function
End Module
                

Lösung von: Elias Zech (Optics Balzers)

HTML Code:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="zweierpotenz.php" method="post">
    <input type="number" min="0" name="num">Tragen Sie hier die Nummer ein<br></input>
    <input type="submit" value="Abschicken" /><input type="reset" />
</form>


</body>
</html>



PHP-Code:


<?php
$xx = $_POST["num"];
$x = log($xx, 2);
$pos = strpos($x, ".");


if ($pos === false)
{
    echo $xx . " ist eine Zweierpotenz";
}
else
{
    echo $xx . " ist keine Zweierpotenz";
}

?>

                

Lösung von: Maik Scheiermann (Powercloud GmbH)

REPORT ZWEIERPOTENZ.

PARAMETERS lv_eing TYPE i.

DATA: lv_ausg  TYPE string,
      lv_ausg1 TYPE string,
      lv_pruef TYPE i,
      lv_erg   TYPE c.

lv_ausg  = 'Der Wert '.
lv_pruef = 2.
lv_erg   = 0.

IF lv_eing <= 0.
    lv_ausg1 = ' ist ungültig.'.
ELSEIF lv_eing = 1.
    lv_erg   = 1.
ELSE.

    WHILE lv_pruef <= lv_eing.
        IF  lv_pruef = lv_eing.
            lv_erg   = 1.
            lv_pruef = lv_pruef + 1.
        ELSE.
            lv_pruef = lv_pruef * 2.
        ENDIF.

    ENDWHILE.

    IF lv_erg = 1.
        lv_ausg1 = ' ist eine Zweierpotenz.'.
    ELSE.
        lv_ausg1 = ' ist keine Zweierpotenz.'.
    ENDIF.

ENDIF.

WRITE:/ lv_ausg, lv_eing, lv_ausg1.
                

Lösung von: Name nicht veröffentlicht

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

namespace Zweierpotenzen
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Put in your number:");
            int eingabe = Convert.ToInt32(Console.ReadLine());
            int testnumber=1;
            string wert = "FALSE";
            for (int i = 0; i <= 9999; i++)
            {
                if (testnumber == eingabe)
                {
                    wert = "TRUE";
                    break;
                }
                testnumber = testnumber * 2;
            }
            Console.WriteLine(wert);
            Console.ReadLine();
        }
    }
}

                

Lösung von: lenergy lenergy (HTL)

from math import log
zweier = lambda x : True if log(x,2) % 1 == 0 else False
                

Lösung von: rob ert (tub)

Verifikation/Checksumme:

Zweierpotenzen sind

1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, ...

Bei allen anderen Zahlen soll Ihr Programm ausgeben, dass es sich nicht um eine Zweierpotenz handelt.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.25
Schwierigkeit: Leicht
Webcode: g378-zfif
Autor: Philipp Gressly Freimann (SANTIS Training AG)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen