Числовые операции над строками с C - PullRequest
0 голосов
/ 10 декабря 2011

Меня попросили сделать калькулятор, принимающий входные данные в виде строки, чтобы мы могли рассчитывать с длинными числами, результатом также должна быть строка.Я попробовал сложную часть, но она не работает с двумя числами разной длины.Может кто-нибудь сказать мне, где мой код не работает и как я могу это исправить?Также идея о том, как бы я разделить, используя этот принцип.

i = strlen(first);
j = strlen(second);
x = 0;

while(1)
{
   z = (first[i-1] - 48) + (second[j-1] - 48) + carry;
   carry = z/10;
   result1[x] = z%10 + 48;

   x++;
   i--;
   j--;

   if(i==0 && j==0)
   {   if(carry!=0)
       result1[x] = carry + 48;
       break;
   }
}

 i = strlen(result1);

for (i = 0, j = strlen(result1)-1; i < j; i++, j--)
   {
     c = result1[i];
     result1[i] = result1[j];
     result1[j] = c;
   }

puts(result1);

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Вы должны начать суммирование с наименьших значащих цифр в каждой строке; если сумма превышает 9, вы переносите 1 на следующую более значимую цифру. Так же, как вы делаете на бумаге. Это также означает, что вам нужно организовать вещи так, чтобы вы знали, какова длина каждой строки (числа), и имели дело с «неявными нулями» перед более коротким числом.

0 голосов
/ 10 декабря 2011
z = (first[i-1] - 48) + (second[j-1] - 48) + carry;

Это не будет работать, если один из i или j равен нулю или отрицателен.Если вы хотите продолжить цикл до тех пор, пока не будут использованы обе строки, вы можете использовать?: Чтобы избежать небезопасного доступа к массиву.Вам также может быть проще уменьшить i и j в начале цикла.

if(i==0 && j==0)

Это не сработает, если i! = J.Вам нужно найти лучший способ завершить цикл.(С осторожной условной логикой выше вы могли бы даже продолжить цикл, пока перенос не станет равным нулю.)

...