#include<stdio.h>
int count_num_string(char*);
void str_reverse(char*, int);
void mul_and_sum(char*, char*, int, int);
int main()
{
char str1[50], str2[50];
char sum_str[100] = "0";
printf("Enter num string1 : ");
scanf("%s",str1);
printf("Enter num string2 : ");
scanf("%s", str2);
int len1, len2, l, m;
len1 = count_num_string(str1);
len2 = count_num_string(str2);
str_reverse(str1, len1);
str_reverse(str2, len2);
mul_and_sum(str1, str2, len1, len2);
printf("str1 = '%s'\n", sum_str);
//printf("str2 = %s\n", str2);
}
int count_num_string(char* str)
{
int i = 0;
while(str[i] != 0)
i++;
return i;
}
void str_reverse(char *str, int len)
{
int count, i;
char *begin_ptr, *end_ptr, ch;
begin_ptr = str;
end_ptr = str +len -1;
if(len%2 == 0)
count = len/2;
else if(len%2 != 0)
count = (len-1)/2;
for(i = 0;i<count;i++){
ch = *end_ptr;
*end_ptr = *begin_ptr;
*begin_ptr = ch;
begin_ptr++;
end_ptr--;
}
}
void mul_and_sum(char* str1, char* str2, int len1, int len2)
{
char sum_str[100] = "0";
int bigger, smaller,m, add_zero,j,k,adjuster, sum;
int carry = 0, carry1 = 0, carry2 = 0;
char mulstr[100];
if(len1>=len2){
bigger = len1;
smaller = len2;
for(j= 0;j<smaller;j++){
m=0;
for(k = 0; k<bigger; k++){
mulstr[m] = (((str1[k]-48)*(str2[j]-48)) + carry)%10;
carry = (((str1[k]-48)*(str2[j]-48)) + carry)/10;
printf("multstr[%d] = %d, carry = %d\n", m,mulstr[m],carry);
m++;
}
mulstr[m] = carry;
printf("multstr[%d] = %d\n", m,mulstr[m]);
if(j == 0){ //m+1 = elements+carry//add later m+1
**for(sum = 0; sum<m+1; sum++){
sum_str[sum] = (((sum_str[sum]-48)+(mulstr[sum]-48))+carry1)%10;
carry1 = (((sum_str[sum]-48)+(mulstr[sum]-48))+carry1)/10;
printf("sumstr[%d] = %d, carry1 = %d\n", sum,mulstr[sum],carry1);
**
}
printf("carry = %d", carry1);
sum_str[sum] = carry1-48;
printf("sumstr[%d] = %d\n", sum,mulstr[sum]);
sum++;
printf("hello sumstr[%d] = %d\n", sum,mulstr[sum]);
// sum_str[sum] = '\0';
}
if(j>0){
int shifter, size, zero_adder,add;
adjuster = m+j;
printf("m = %d, adjuter = %d,j = %d\n", m, adjuster,j);
size = j;
for(shifter = adjuster;shifter>=size;shifter--)
{
mulstr[shifter]= mulstr[shifter-size];
printf("multstr[%d] = %d\n", shifter,mulstr[shifter]);
}
for(zero_adder = 0;zero_adder<size;zero_adder++){
mulstr[zero_adder] = 0;
printf("multstr[%d] = %d\n", zero_adder,mulstr[zero_adder]);
}
printf("one done\n");
for(add = 0; add<=adjuster; add++){
printf("sumstr[%d] = %d, multstr[%d] = %d\n", add, sum_str[add], add, mulstr[add]);
sum_str[add] = (sum_str[add]+mulstr[add]+carry2)%10;
carry2 = (sum_str[add]+mulstr[add]+carry2)/10;
//printf("sumstr[%d] = %d\n", add,sum_str[add]);
}
sum_str[sum] = carry2;
sum++;
sum_str[sum] = '\0';
//str_reverse(sum_str, add);
}
}
}
}
The following is the output:
Enter num string1 : 1234
Enter num string2 : 123
multstr[0] = 2, carry = 1
multstr[1] = 0, carry = 1
multstr[2] = 7, carry = 0
multstr[3] = 3, carry = 0
multstr[4] = 0
sumstr[0] = 2, **carry1** = -10
sumstr[1] = 0, **carry1** = -11
sumstr[2] = 7, **carry1** = -10
sumstr[3] = 3, **carry1** = -10
sumstr[4] = 0, **carry1** = -11
**carry** = -11sumstr[5] = 0
hello sumstr[6] = 0
multstr[0] = 8, carry = 0
multstr[1] = 6, carry = 0
multstr[2] = 4, carry = 0
multstr[3] = 2, carry = 0
multstr[4] = 0
m = 4, adjuter = 5,j = 1
multstr[5] = 0
multstr[4] = 2
multstr[3] = 4
multstr[2] = 6
multstr[1] = 8
multstr[0] = 0
one done
**sumstr[0] = -6**, multstr[0] = 0
**sumstr[1] = -6**, multstr[1] = 8
**sumstr[2] = 0**, multstr[2] = 6
**sumstr[3] = -3**, multstr[3] = 4
**sumstr[4] = -6**, multstr[4] = 2
**sumstr[5] = -59**, multstr[5] = 0
multstr[0] = 4, carry = 0
multstr[1] = 3, carry = 0
multstr[2] = 2, carry = 0
multstr[3] = 1, carry = 0
multstr[4] = 0
m = 4, adjuter = 6,j = 2
multstr[6] = 0
multstr[5] = 1
multstr[4] = 2
multstr[3] = 3
multstr[2] = 4
multstr[0] = 0
multstr[1] = 0
one done
sumstr[0] = -6, multstr[0] = 0
sumstr[1] = 2, multstr[1] = 0
sumstr[2] = 7, multstr[2] = 4
sumstr[3] = 2, multstr[3] = 3
sumstr[4] = -4, multstr[4] = 2
sumstr[5] = -9, multstr[5] = 1
sumstr[6] = 0, multstr[6] = 0
str1 = '0'
I am trying to multiply two 50-digit numbers, without using in-built functions. I highlighted the part of the code, where it is giving error/garbage value for carry1. Also, the sum of strings (sum_str and mulstr) is not correct. Can someone please explain why I am not getting the correct value of carry1 and sum_str?