C :: Aufgabe #1 :: Lösung #1

7 Lösungen Lösungen öffentlich
#1

Multiplikation ohne zu multiplizieren

Anfänger - C von Gustl - 11.11.2012 um 17:24 Uhr
Erstellen Sie ein Konsolenprogramm welches dem Benutzer auffordert 2 Zahlen einzugeben, diese sollen dann multipliziert werden, jedoch ist nur die Grundrechenart Addition erlaubt.

Wenn einer der 2 Zahlen keine Zahl ist, soll eine Fehlermeldung ausgegeben werden und der Benutzer noch einmal aufgefordert werden eine Zahl einzugeben.
#1
vote_ok
von devnull (8870 Punkte) - 08.07.2013 um 07:29 Uhr
Quellcode ausblenden C-Code
/****************************************
  * prod1.c    Produkt ohne Multiplikation
  *            Binäre Stellenwertaddition
  *
  * OS     :   GNU/Linux
  * compile:   gcc -Wall -o prod prod1.c
  *
  * devnull    08-07-2013
  ****************************************/
#include <stdlib.h>
#include <limits.h>
#include <values.h>
#include <stdio.h>
#include <errno.h>

/* values.h: #define INTBITS  sizeof(int)*CHAR_BIT */

/* return an unsigned int */
unsigned int get_number( int lfn )
{
	char snum[20];
	char *ep;
	long int lnum=0;
        
	while (1) {
		printf(" %d. positive ganze Zahl: ", lfn );
        scanf( "%s", snum );
            
        errno = 0;
        lnum = strtol( snum, &ep, 10);
		if ((errno==0) && (*ep=='\0')) {
			if (lnum>=0 && lnum<=INT_MAX) 
				break;
			printf( "Zahl liegt ausserhalb Limits (0..%d)!\n",INT_MAX );
		}
		else
			printf( "Eingabe hat kein korrektes 'long int'-Format!\n" );
	}
	return (unsigned int)lnum;
}

/* calculate product w/o multiplication */
unsigned long int prod( unsigned int i1, unsigned int i2 )
{
	unsigned long int sum=0;
    unsigned long int l1=0;
    int shift;
	
    l1=(unsigned long int)i1; 		
    for (shift=0; shift<INTBITS; shift++)
		if (i2>>shift & 1) sum += l1<<shift;
	return sum;
}

/* main */
int main( void )
{
	unsigned int a = get_number(1);
	unsigned int b = get_number(2);
	printf("%u x %u = %lu\n",a,b,prod(a,b));
    return 0;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben