Hi everyone! Today, I just finished my new number calculator in C! Instead of taking integers to perform arithmetic on, it instead uses strings! It has 5 main functions right now, setting, adding, subtracting, multiplying, and comparing. The code for this is below:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
void giantNumberAdder(char* num1, char* num2) {
int len1 = strlen(num1);
int len2 = strlen(num2);
int carry = 0;
while (len1<len2) {
memmove(num1+1,num1,len1+1);
num1[0] = '0';
len1++;
}
while (len2<len1) {
memmove(num2+1,num2,len2+1);
num2[0] = '0';
len2++;
}
for (int i = len1-1; i>=0; i--) {
int sum = (num1[i]-'0')+(num2[i]-'0')+carry;
num1[i] = (sum%10)+'0';
carry = (sum/10);
}
if (carry) {
memmove(num1+1,num1,len1+1);
num1[0] = carry+'0';
}
}
void giantNumberSubtractor(char* num1, char* num2) { //breaks when num1 is lower than num2 :(
int len1 = strlen(num1);
int len2 = strlen(num2);
int carry = 0;
while (len1<len2) {
memmove(num1+1,num1,len1+1);
num1[0] = '0';
len1++;
}
while (len2<len1) {
memmove(num2+1,num2,len2+1);
num2[0] = '0';
len2++;
}
for (int i = len1-1; i>=0; i--) {
int sum = (num1[i]-'0')-(num2[i]-'0')-carry;
num1[i] = ((sum+10)%10)+'0';
carry = (sum+10)/10;
carry = carry==1 ? 0 : 1;
}
for (int i = 0; i<len1; i++) {
if (num1[0]=='0') {
memmove(num1,num1+1,len1);
len1--;
} else {
break;
}
}
}
void giantNumberMultiplier(char* num1, char* num2) { //alright alright, had to get extra help for this because this was probably the hardest to make.
int* results = calloc(strlen(num1)+strlen(num2),sizeof(int));
for (int i = strlen(num2)-1; i>=0; i--) {
int carry = 0;
for (int j = strlen(num1)-1; j>=0; j--) {
int sumPlace = i+j+1;
int carPlace = i+j;
int sum = (num2[i]-'0')*(num1[j]-'0')+carry;
results[sumPlace] += sum;
results[carPlace] += results[sumPlace]/10;
results[sumPlace] %= 10;
}
}
int i = 0;
int k = 0;
char temp[strlen(num1)+strlen(num2)-1];
while (k<strlen(num1)+strlen(num2) && results[k]==0) {k++;}
if (k==strlen(num1)+strlen(num2)) {temp[i++];}
else {
for (; k<strlen(num1)+strlen(num2); k++) {
temp[i++] = results[k] + '0';
}
}
temp[i] = '\0'; //null term cause important
strcpy(num1,temp);
free(results);
}
void giantNumberSetter(char* num1, char* num2) { //num1 is dest, num2 is src
strcpy(num1,num2);
}
int giantNumberComparator(char* num1, char* num2) { //0 is equal, 1 is num1>num2, and 2 is num2>num1
int len1 = strlen(num1);
int len2 = strlen(num2);
while (len1<len2) {
memmove(num1+1,num1,len1+1);
num1[0] = '0';
len1++;
}
while (len2<len1) {
memmove(num2+1,num2,len2+1);
num2[0] = '0';
len2++;
}
for (int i = 0;i<len1;i++) {
int digit1 = num1[i]-'0';
int digit2 = num2[i]-'0';
if (digit1 > digit2) {
return 1;
}
if (digit1 < digit2) {
return 2;
}
}
for (int i = 0; i<len1; i++) {
if (num1[0]=='0') {
memmove(num1,num1+1,len1);
len1--;
} else {
break;
}
}
for (int i = 0; i<len2; i++) {
if (num2[0]=='0') {
memmove(num2,num2+1,len2);
len2--;
} else {
break;
}
}
return 0;
}
