Dodawanie dużych liczb pisemnie - funkcja nie działa prawidłowo

0

Hey. Mam problem. Program ma wczytać długości dwóch liczb (max 255 cyfr), następnie wylosować dwie liczby o tych długościach, wypisać je na ekran, następnie dodać i wypisać wynik.

Tutaj moje wypociny. Funkcja "sum" jest skopana, ale nie mam pomysłu jak to zrobić.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

unsigned short int bigger(unsigned short int x, unsigned short int y)
{
	x > y ? y = x : x = y;
	return x;
}

void write(unsigned short int numberLenght, char * number)
{
	for (int i = 0; i < numberLenght; ++i)
	{
		printf("%c", *(number + i));
	}
}

void random(unsigned short int numberLength, char * &number)
{
	srand(time(NULL));
	for (int i = 0; i < numberLength; ++i)
	{
		*(number + i) = (rand() % 10) + 48;
	}
	*number = (rand() % 9) + 49; // Gdyby pierwsza wylosowana cyfra liczby okazała się być zerem.
}

void sum(unsigned short int x, unsigned short int y, char * firstNumber, char * secondNumber, char* &result)
{
	unsigned short int lenght = bigger (x, y), rest = 0, addition = 0;
	while (lenght >= 0) 
	{
		addition = (*(firstNumber + x - 1) - 48) + (*(secondNumber + y - 1) - 48) + rest;
		if (addition >= 10) 
		{ 
			*(result + lenght) = addition - 10 + 48;
			rest = 1;
		} 
		else 
		{ 
			*(result + lenght) = addition + 48; 
			rest = 0; 
		} 
		lenght--;
	}
}

int main()
{
	unsigned short int y = 0, x = 0;
	printf("%s", "Podaj dlugosc pierwszej liczby: ");
	scanf("%d", &x);
	printf("%s", "Podaj dlugosc drugiej liczby: ");
	scanf("%d", &y);
	if (x < 256 && y < 256)
	{
		char * firstNumber = (char*) malloc(x * sizeof(*firstNumber));
		char * secondNumber = (char*) malloc(y * sizeof(*secondNumber));
		char * result = (char*) malloc((bigger(x, y) + 1) * sizeof(*secondNumber));		
		random(x, firstNumber);
		random(y, secondNumber);
		printf("%s", "Pierwsza liczba to: ");
		write(x, firstNumber);
		printf("\n");
		printf("%s", "Druga liczba to: ");
		write(y, secondNumber);
		printf("\n\n");
		write(x, firstNumber);
		printf("%s", " + ");
		write(y, secondNumber);
		printf("%s", " = ");
		write(bigger(x, y), result);
		free(firstNumber);
		free(secondNumber);
	}
	else
	{
		printf("s", "Podano zbyt duze liczby.");
	}
	return 0;
}
1

Skoro to jest C++ to:

  1. Wywal malloc i free. Używaj std::vector.
  2. Wywal wszystkie wskaźniki. Parametry przekazuj albo przez wartość, albo referencję.
  3. Wywal bigger, użyj std::max
  4. Używaj cin, cout
  5. Przenieś srand() do main

Co to ma robić?

addition = (*(firstNumber + x - 1) - 48) + (*(secondNumber + y - 1) - 48) + rest;
0

Trochę zmian, ale nadal nie działa:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <ctime>

using namespace std;

void write(unsigned short int numberLength, char * number)
{
	for (int i = 0; i < numberLength; ++i)
	{
		printf("%c", *(number + i));
	}
}

void random(unsigned short int numberLength, char * &number)
{
	for (int i = 0; i < numberLength; ++i)
	{
		*(number + i) = (rand() % 10) + 48;
	}
	*number = (rand() % 9) + 49; // Gdyby pierwsza wylosowana cyfra liczby okazała się byc zerem.
}

void sum(unsigned short int x, unsigned short int y, char * firstNumber, char * secondNumber, char* &result)
{
	unsigned short int length = max(x, y) + 1, rest = 0;
	while (length >= 0) 
	{
		unsigned char addition = 48;
		length--;
		x--;
		y--;
		if (x >= 0 && y >= 0)
		{
			addition += (*(firstNumber + x) - 48) + (*(secondNumber + y) - 48) + rest;
		}
		if (x < 0)
		{
			addition += (*(secondNumber + y) - 48) + rest;
		}
		if (y < 0)
		{
			addition += (*(firstNumber + x) - 48) + rest;
		}
		if (x < 0 && y < 0)
		{
			addition += rest;
		}
		if (addition >= 58) 
		{ 
			addition = addition - 10;
			rest = 1;
			*(result + length) = addition;
		}
		if (addition < 58) 
		{ 
			rest = 0;
			*(result + length) = addition;
		}
	}
}

int main()
{
	unsigned short int y = 0, x = 0;
	printf("%s", "Podaj dlugosc pierwszej liczby: ");
	scanf("%d", &x);
	printf("%s", "Podaj dlugosc drugiej liczby: ");
	scanf("%d", &y);
	if (x < 256 && y < 256)
	{
		char * firstNumber = (char*) malloc(x * sizeof(*firstNumber));
		char * secondNumber = (char*) malloc(y * sizeof(*secondNumber));
		char * result = (char*) malloc((max(x, y) + 1) * sizeof(*secondNumber));	
		srand(time(NULL));
		random(x, firstNumber);
		random(y, secondNumber);
		printf("%s", "Pierwsza liczba to: ");
		write(x, firstNumber);
		printf("\n");
		printf("%s", "Druga liczba to: ");
		write(y, secondNumber);
		printf("\n\n");
		write(x, firstNumber);
		printf("%s", " + ");
		write(y, secondNumber);
		printf("%s", " = ");
		sum(x, y, firstNumber, secondNumber, result);
		write(max(x, y) + 1, result);
		free(firstNumber);
		free(secondNumber);
		free(result);
	}
	else
	{
		printf("%s", "Podano zbyt duze liczby.");
	}
	return 0;
}

Nie wiem czemu wywala się w funkcji sum().

1

Gdy length == 0 najpierw robisz length-- a potem *(result + length) =…. To tylko jedna z przyjemnych cech zabawy z wskaźnikami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1