C :: Aufgabe #1
7 Lösungen
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.
Wenn einer der 2 Zahlen keine Zahl ist, soll eine Fehlermeldung ausgegeben werden und der Benutzer noch einmal aufgefordert werden eine Zahl einzugeben.
Lösungen:
/****************************************
* 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;
}
/****************************************
* prod2.c Produkt ohne Multiplikation
* Dezimale Stellenwertaddition
* ("schriftlich multiplizieren")
*
* OS : GNU/Linux
* compile: gcc -Wall -o prod prod2.c
*
* devnull 08-07-2013
****************************************/
#include <stdlib.h>
#include <limits.h>
#include <values.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
/* return an unsigned int */
unsigned int get_number( int lfn )
{
char snum[20];
char *ep;
long int lnum;
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 x*cdigit w/o multiplication */
unsigned long int mul( unsigned long int x, char cdigit )
{
switch (cdigit) {
case '1': return x;
case '2': return x<<1;
case '3': return (x<<1)+x;
case '4': return x<<2;
case '5': return (x<<2)+x;
case '6': return ((x<<1)+x)<<1;
case '7': return (((x<<1)+x)<<1)+x;
case '8': return x<<3;
case '9': return (x<<3)+x;
case 'A': return ((x<<2)+x)<<1;
}
return 0;
}
unsigned long int prod( unsigned int i1, unsigned int i2 )
{
unsigned long int sum=0;
unsigned long int l1=0;
char istr[12];
int p;
l1=(unsigned long int)i1;
sprintf( istr, "%u", i2 );
for (p=strlen(istr);p;p--) {
sum += mul(l1,istr[p-1]);
l1 = mul(l1,'A');
}
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;
}
/****************************************
* prod3.c Produkt ohne Multiplikation
* einfache Addition in Schleife
*
* OS : GNU/Linux
* compile: gcc -Wall -o prod prod3.c
*
* devnull 08-07-2013
****************************************/
#include <stdlib.h>
#include <limits.h>
#include <values.h>
#include <stdio.h>
#include <errno.h>
/* 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 int cnt=(i1<i2)?i1:i2;
unsigned int add=(i1<i2)?i2:i1;
unsigned int i;
for (i=0;i<cnt;i++) sum+=add;
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;
}
Ein Problem gibt es jedoch, die Multiplikation mit 0 wird nicht akzeptiert. Was natürlich unsauber ist. Aber wenn jmd. einen Verbesserungsvorschlag hat, bin ich ganz Ohr. =)
C-Code
/* Ah3
* OS: Macintosh; Intel Mac OS X 10_11_5
* compile: gcc -std=c11 -Wall -Wextra -pedantic -o mult 1.c
* date: 16-07-2016
* Example:
* ./mult
* ./mult 12 13
*/
#include <stdio.h> // to use printf()
#include <stdlib.h> // to use atoi()
void mult(int dig1, int dig2);
int main(int argc, char const *argv[]){
// check input
if (argc == 1) {
// if no argument given
char zahl1[32];
char zahl2[32];
printf("%s\n", "Bitte Zahl 1 eingeben: " );
scanf("%s", zahl1);
printf("%s\n", "Bitte Zahl 2 eingeben: " );
scanf("%s", zahl2);
mult(atoi(zahl1), atoi(zahl2));
} else if (argc == 3) {
// if we got two digits
mult(atoi(argv[1]), atoi(argv[2]));
} else {
printf("%s\n", "Something went wrong with your arguments. We start again." );
main(1,0);
}
}
void mult(int dig1, int dig2) {
int result = dig1;
for (int i = 1;i < dig2; i++) {
result += dig1;
}
if (dig1 == 0 || dig2 == 0) {
printf("%s\n", "Something went wrong with your arguments. We start again." );
main(1,0);
} else {
printf("Das Produkt aus %i * %i = %i\n", dig1, dig2, result );
}
}
/*
* Datei: Aufgabe-0001.c
* Datum: 04.01.2019
*
* Aufgabe: Multiplikation ohne zu multiplizieren
* 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.
*/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int getNumber(char *numberAsString);
int multiplication(int operant1, int operant2);
int main (int argc, char **argv) {
int numbers[3] = { 0 };
numbers[0] = getNumber((2 <= argc) ? argv[1] : NULL);
numbers[1] = getNumber((3 <= argc) ? argv[2] : NULL);
numbers[2] = multiplication(numbers[0], numbers[1]);
printf("%i * %i = %i", numbers[0], numbers[1], numbers[2]);
return EXIT_SUCCESS;
}
int getNumber(char *numberAsString) {
int result = 0;
int number = 0;
char ch;
if (numberAsString != NULL) {
result = sscanf_s(numberAsString, "%i", &number);
if (result != 1) {
printf("%s ist keine gueltige Ganzzahl.\n", numberAsString);
}
}
while (result != 1) {
printf("Ganzzahl eingeben: ");
result = scanf_s("%i", &number);
while ((ch = getchar()) != '\n' && ch != EOF);
if (result != 1) {
printf("Ihre Eingabe ist keine gueltige Ganzzahl.\n");
}
}
return number;
}
int multiplication(int operant1, int operant2) {
int solution = 0;
if (operant1 < 0) {
operant2 *= -1;
operant1 *= -1;
}
for (int i = 0; i < operant1; ++i) {
solution += operant2;
}
return solution;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int zahl1, zahl2, loesung, i;
loesung = 0;
printf("Bitte gebe die 1. ganzzahlige Zahl ein: ");
if(scanf("%d", &zahl1)!=1) {
printf("Fehler bitte eine ganzzahlige Zahl eingeben. \n");
return EXIT_FAILURE;
}
printf("Bitte gebe die 2. ganzzahlige Zahl ein: ");
if(scanf("%d", &zahl2)!=1) {
printf("Fehler bitte eine ganzzahlige Zahl eingeben. \n");
return EXIT_FAILURE;
}
for (i= 1; i<=zahl2; i++) {
loesung = loesung + zahl1;
}
printf("Die Lösung ist: %d\n",loesung);
return EXIT_SUCCESS;
}
/* multiplizieren ohne zu multipliziern */
#include <stdio.h>
#include <stdlib.h>
/* Funktion fuer die Multiplikation */
unsigned int multiplizieren(unsigned int a,unsigned int b){
unsigned int i, c=0;
for(i=1; i<=b; i++){
c+=a;
}
return c;
}
int main(void){
unsigned int zahl1, zahl2, ergebniss, check1, check2;
printf("--------------------------------------\n");
printf("Multiplizieren ohne zu multiplizieren!\n");
printf("--------------------------------------\n\n");
printf("Geben sie die Zahl 1 ein: ");
/* zwei Schleifen, da sonnst, bei einer Eingabe einse Zeichens *
* oder eine Buchstaben eine Dauerschleife ausgeloest wird. *
* da der Puffer nicht geleert wird. */
do{
check1=scanf("%u", &zahl1);
if(check1!=1){
printf("Fehler!!!\n");
printf("Bitte noch ein Mal die Zahl 1 eingeben.\n");
printf("Zahl 1: ");
}
} while(getchar()!='\n');
printf("\n--------------------------------------\n\n");
printf("Geben sie die Zahl 2 ein: ");
do{
check2=scanf("%u", &zahl2);
if(check2!=1){
printf("Fehlre!!!\n");
printf("Bitte noch ein die Zahl 2 eingeben!\n");
printf("Zahl 2: ");
}
} while(getchar()!='\n');
printf("\n\n");
printf("--------------------------------------\n");
ergebniss=multiplizieren( zahl1, zahl2);
printf("%u * %u = %u\n", zahl1, zahl2, ergebniss);
printf("--------------------------------------\n");
return EXIT_SUCCESS;
}