C 内联计算器
我正在尝试制作一个无穷大计算器(数字大小大于或小于整数),只处理字符串。 我正在做加法,但当我需要向下一个字符报告十时,我会遇到问题:比如9+7=16,我将在当前字符中输入6,在结果字符串的下一个字符中输入1。 这是我的密码:C 内联计算器,c,string,C,String,我正在尝试制作一个无穷大计算器(数字大小大于或小于整数),只处理字符串。 我正在做加法,但当我需要向下一个字符报告十时,我会遇到问题:比如9+7=16,我将在当前字符中输入6,在结果字符串的下一个字符中输入1。 这是我的密码: char *add_inf(char *nb1, char *nb2, char *rslt) { if (*nb1 && *nb2) { *rslt = (*nb1 - '0' + *nb2 - '0' > 9 ?
char *add_inf(char *nb1, char *nb2, char *rslt)
{
if (*nb1 && *nb2)
{
*rslt = (*nb1 - '0' + *nb2 - '0' > 9 ? (*nb1 - '0' + *nb2 - '0') % 10 : *nb1 - '0' + *nb2 - '0') + *rslt - '0' + '0';
if (*nb1 - '0' + *nb2 - '0' > 9)
{
rslt++;
*rslt = '1'; //Here i put the next char to '1'
add_inf(nb1 + 1, nb2 + 1, rslt);
}
add_inf(nb1 + 1, nb2 + 1, rslt + 1);
}
return (rslt);
}
很抱歉-'0'和+'0'太乱了,我应该在计算之前做一个函数将其细分并添加。
当输入为nb1=“11111111”和nb2=“58856557”时,输出正确:
69967668
但当我输入nb1=“1111 4”和nb2=“588856557”时,输出为:
699676611
将1添加到下一个字符并具有:
69967671
它只是将“1”字符添加到我的结果字符串中。
想法?您似乎缺少一个“其他”:
我不理解顺序-只有在执行加法时字符串以相反顺序存储时,代码才应该工作。1。我将向您展示三行等效的代码:
当
*nb1-'0'+*nb2-'0'时,有一个问题:您将如何使您的函数添加4
和99999
(甚至99990
)?我已将代码减少到最低限度,以便于理解。我正在管理两个不同长度字符串的添加,如果这是您的问题那么,只需在前面的字符串中添加一个伪0
。因此,不是添加“4”
和“9999”
而是添加“04”
和“099999”
。这解决了您的问题,额外的领先1
Hum您可能是正确的顺序,需要尝试!但是我觉得我不需要其他的,因为如果*nb1+*nb2>9我回叫add\u inf也会很好地避免“数组索引超出范围”(例如,可能通过检查和调整数组大小)。@Robin因为在第一个add\u inf
之后没有return
,一旦从递归返回,代码将再次调用add\u inf
。要防止这种情况发生,还必须采取其他措施。
char *add_inf(char *nb1, char *nb2, char *rslt)
{
if (*nb1 && *nb2)
{
*rslt = (*nb1 - '0' + *nb2 - '0' > 9 ? (*nb1 - '0' + *nb2 - '0') % 10 : *nb1 - '0' + *nb2 - '0') + *rslt - '0' + '0';
if (*nb1 - '0' + *nb2 - '0' > 9)
{
rslt++;
*rslt = '1'; //Here i put the next char to '1'
add_inf(nb1 + 1, nb2 + 1, rslt);
}
else // sum is less than 10
add_inf(nb1 + 1, nb2 + 1, rslt + 1);
}
return (rslt);
}
*rslt = (*nb1 - '0' + *nb2 - '0' > 9 ? (*nb1 - '0' + *nb2 - '0') % 10 : *nb1 - '0' + *nb2 - '0') + *rslt - '0' + '0';
*rslt = ((*nb1 - '0' + *nb2 - '0') % 10) + *rslt - '0' + '0';
*rslt += (*nb1 - '0' + *nb2 - '0') % 10;
char *add_inf(char *nb1, char *nb2, char *rslt) {
if (*nb1 && *nb2) {
int sum = (*nb1 - '0' + *nb2 - '0' + *rslt - '0');
*(rslt + 0) = (sum % 10) + '0';
if (sum / 10)
*(rslt + 1) = (sum / 10) + '0';
add_inf(nb1 + 1, nb2 + 1, rslt + 1);
}
return rslt;
}
int main() {
char nb1[] = "11111114";
char nb2[] = "58856557";
char output[] = "000000000";
add_inf(nb1, nb2, output);
printf("%s\n", output);
}
char *add_inf(char *nb1, char *nb2, char *rslt) {
int len = strlen(nb1);
int carry = 0;
for (int i=len - 1; i >= 0; --i) {
int sum = (nb1[i] - '0' + nb2[i] - '0' + carry);
rslt[i] = (sum % 10) + '0';
carry = (sum / 10);
}
return rslt;
}
int main() {
char nb1[] = "11111114";
char nb2[] = "58856557";
char output[] = "00000000";
add_inf(nb1, nb2, output);
printf("%s\n", output);
}
69967671