Added last 2 functions
This commit is contained in:
parent
06d59994bf
commit
20b90a2156
3 changed files with 146 additions and 7 deletions
28
.vscode/tasks.json
vendored
Normal file
28
.vscode/tasks.json
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "cppbuild",
|
||||||
|
"label": "C/C++: gcc build active file",
|
||||||
|
"command": "/usr/bin/gcc",
|
||||||
|
"args": [
|
||||||
|
"-fdiagnostics-color=always",
|
||||||
|
"-g",
|
||||||
|
"${file}",
|
||||||
|
"-o",
|
||||||
|
"${fileDirname}/${fileBasenameNoExtension}"
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"cwd": "${fileDirname}"
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"detail": "Task generated by Debugger."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": "2.0.0"
|
||||||
|
}
|
||||||
BIN
assignment/pyramid_of_numbers
Normal file
BIN
assignment/pyramid_of_numbers
Normal file
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
||||||
/*----------------------------------------------------------
|
/*----------------------------------------------------------
|
||||||
* HTBLA-Leonding / Class: <your class>
|
* HTBLA-Leonding / Class: 2IHIF
|
||||||
* ---------------------------------------------------------
|
* ---------------------------------------------------------
|
||||||
* Exercise Number: 0
|
* Exercise Number: 0
|
||||||
* Title: Pyramid of Numbers
|
* Title: Pyramid of Numbers
|
||||||
* Author: <your name>
|
* Author: Marc Tismonar
|
||||||
* ----------------------------------------------------------
|
* ----------------------------------------------------------
|
||||||
* Description:
|
* Description:
|
||||||
* Calculates a pyramid of numbers, i.e., it multiplies a big
|
* Calculates a pyramid of numbers, i.e., it multiplies a big
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
* ----------------------------------------------------------
|
* ----------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/// The maximum number of digits allowed in a big int.
|
/// The maximum number of digits allowed in a big int.
|
||||||
#define MAX_DIGITS 80
|
#define MAX_DIGITS 80
|
||||||
|
|
@ -36,32 +37,99 @@ struct BigInt {
|
||||||
*** @param *big_int The converted string now as BigInt.
|
*** @param *big_int The converted string now as BigInt.
|
||||||
* @return The number of characters converted.
|
* @return The number of characters converted.
|
||||||
*/
|
*/
|
||||||
int strtobig_int(const char* str, int len, struct BigInt* big_int);
|
int strtobig_int(const char* str, int len, struct BigInt* big_int) {
|
||||||
|
int conversions = 0;
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
int converted = str[i] - '0';
|
||||||
|
if (converted >= 0 && converted <= 9)
|
||||||
|
{
|
||||||
|
big_int->the_int[conversions] = converted;
|
||||||
|
conversions++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
big_int->digits_count = conversions;
|
||||||
|
return conversions;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
big_int->digits_count = conversions;
|
||||||
|
return conversions;
|
||||||
|
}
|
||||||
|
|
||||||
/** print_big_int() prints a BigInt.
|
/** print_big_int() prints a BigInt.
|
||||||
*** @param *big_int The BigInt to be printed.
|
*** @param *big_int The BigInt to be printed.
|
||||||
*/
|
*/
|
||||||
void print_big_int(const struct BigInt *big_int);
|
void print_big_int(const struct BigInt *big_int) {
|
||||||
|
for (int i = 0; i < big_int->digits_count; i++)
|
||||||
|
{
|
||||||
|
printf("%d", big_int->the_int[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** multiply() multiplies a BigInt by an int.
|
/** multiply() multiplies a BigInt by an int.
|
||||||
*** @param big_int The BigInt to be multiplied.
|
*** @param big_int The BigInt to be multiplied.
|
||||||
*** @param factor The int value which is multiplied by BigInt.
|
*** @param factor The int value which is multiplied by BigInt.
|
||||||
*** @param *big_result The result of the multiplication.
|
*** @param *big_result The result of the multiplication.
|
||||||
*/
|
*/
|
||||||
void multiply(const struct BigInt* big_int, int factor, struct BigInt* big_result);
|
void multiply(const struct BigInt* big_int, int factor, struct BigInt* big_result) {
|
||||||
|
int overflow = 0;
|
||||||
|
int sizeOfResult = big_int->digits_count + 1;
|
||||||
|
char big_str_result[sizeOfResult];
|
||||||
|
for(int i = 0; i < big_int->digits_count; i++)
|
||||||
|
{
|
||||||
|
int result = big_int->the_int[i] * factor + overflow;
|
||||||
|
if (result > 9)
|
||||||
|
{
|
||||||
|
overflow = result / 10;
|
||||||
|
result = result - overflow;
|
||||||
|
}
|
||||||
|
big_str_result[i] = result + '0';
|
||||||
|
}
|
||||||
|
if (big_str_result[sizeOfResult - 1] == '0')
|
||||||
|
{
|
||||||
|
sizeOfResult--;
|
||||||
|
}
|
||||||
|
|
||||||
|
strtobig_int(big_str_result, sizeOfResult, big_result);
|
||||||
|
}
|
||||||
|
|
||||||
/** divide() multiplies a BigInt by an int.
|
/** divide() multiplies a BigInt by an int.
|
||||||
*** @param big_int The BigInt to be divided.
|
*** @param big_int The BigInt to be divided.
|
||||||
*** @param divisor The int value by which we want to devide big_int.
|
*** @param divisor The int value by which we want to devide big_int.
|
||||||
*** @param *big_result The result of the division.
|
*** @param *big_result The result of the division.
|
||||||
*/
|
*/
|
||||||
void divide(const struct BigInt* big_int, int divisor, struct BigInt* big_result);
|
void divide(const struct BigInt* big_int, int divisor, struct BigInt* big_result) {
|
||||||
|
int remainder = 0;
|
||||||
|
int sizeOfResult = big_int->digits_count;
|
||||||
|
char str_result[sizeOfResult];
|
||||||
|
for (int i = 0; i < big_int->digits_count; i++)
|
||||||
|
{
|
||||||
|
int calculate = remainder * 10;
|
||||||
|
calculate += big_int->the_int[i];
|
||||||
|
int result = calculate / divisor;
|
||||||
|
if (result == 0) {
|
||||||
|
remainder = big_int->the_int[i];
|
||||||
|
}
|
||||||
|
str_result[i] = result + '0';
|
||||||
|
}
|
||||||
|
if (str_result[sizeOfResult - 1] == '0')
|
||||||
|
{
|
||||||
|
sizeOfResult--;
|
||||||
|
}
|
||||||
|
strtobig_int(str_result, sizeOfResult, big_result);
|
||||||
|
}
|
||||||
|
|
||||||
/** copy_big_int() copies a BigInt to another BigInt.
|
/** copy_big_int() copies a BigInt to another BigInt.
|
||||||
*** @param from The source where we want to copy from.
|
*** @param from The source where we want to copy from.
|
||||||
*** @param *to The target where we want to copy to.
|
*** @param *to The target where we want to copy to.
|
||||||
*/
|
*/
|
||||||
void copy_big_int(const struct BigInt* from, struct BigInt* to);
|
void copy_big_int(const struct BigInt* from, struct BigInt* to) {
|
||||||
|
to->digits_count = from->digits_count;
|
||||||
|
for (int i = 0; i < from->digits_count; i++) {
|
||||||
|
to->the_int[i] = from->the_int[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*** main() reads the base number from which the pyramid has to be calculated
|
*** main() reads the base number from which the pyramid has to be calculated
|
||||||
|
|
@ -76,5 +144,48 @@ void copy_big_int(const struct BigInt* from, struct BigInt* to);
|
||||||
*/
|
*/
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
printf("Pyramid of Numbers\n\n");
|
||||||
|
|
||||||
|
printf("Please enter a number: ");
|
||||||
|
char input_str[MAX_DIGITS];
|
||||||
|
scanf("%s", input_str);
|
||||||
|
|
||||||
|
struct BigInt original_big_int;
|
||||||
|
int len = strlen(input_str);
|
||||||
|
strtobig_int(input_str, len, &original_big_int);
|
||||||
|
|
||||||
|
struct BigInt changed_big_int;
|
||||||
|
copy_big_int(&original_big_int, &changed_big_int);
|
||||||
|
|
||||||
|
//multiply
|
||||||
|
for (int i = 2; i < 10; i++)
|
||||||
|
{
|
||||||
|
//create temp BigInt & multiply
|
||||||
|
struct BigInt temp;
|
||||||
|
multiply(&changed_big_int, i, &temp);
|
||||||
|
|
||||||
|
print_big_int(&changed_big_int);
|
||||||
|
printf(" * %d = ", i);
|
||||||
|
print_big_int(&temp);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
copy_big_int(&temp, &changed_big_int);
|
||||||
|
}
|
||||||
|
|
||||||
|
//divide
|
||||||
|
for (int i = 9; i > 1; i--)
|
||||||
|
{
|
||||||
|
//create temp BigInt & multiply
|
||||||
|
struct BigInt temp;
|
||||||
|
divide(&changed_big_int, i, &temp);
|
||||||
|
|
||||||
|
print_big_int(&changed_big_int);
|
||||||
|
printf(" / %d = ", i);
|
||||||
|
print_big_int(&temp);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
copy_big_int(&temp, &changed_big_int);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue