c - 将大数字作为字符串进行操作

标签 c string numbers

我有一个问题:

创建一个 C 程序,将大整数作为字符串输入。
然后将每个字符转换为相应的数字。

之后我必须创建一个函数 addBigNumbers()有 3 个矩阵。

addBigNumbers(char *a1, char *a2, char *res)

a1a2 将包含我想要添加的 2 个大数字,res 将包含这些数字的总和作为数字序列。我们希望我们创建的函数能够检查字符串是否仅包含数字。

如果它仅包含数字,则 res 等于 1,并打印这些数字的总和,否则 res 等于 0(最大数字长度为 1000)

在第一个函数之后,我们要创建一个减法函数。

自从我陷入第一个困境以来,到目前为止我还没有学过减法,我需要你的帮助。

这是我到目前为止的代码:

#include <stdio.h>
#include <stdlib.h>
#define N 1000

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 int addHugeNumbers(char *a1, char *a2, char *res){
    int y=0, u=0, h=0;
    res=strcat(a1,a2);
    if(strlen(a1)>strlen(a2)){
        y=atoi(a1);
        u=atoi(a2);
        h=y+u;
     }
     else{
        y=atoi(a1);
        u=atoi(a2);
        h=u+y;
     }
     printf("%d", h);
 }

int main(int argc, char *argv[]) {
    char res[N];
    char a1[N/2];
    char a2[N/2];
    scanf("%s", &a1);
    scanf("%s", &a2);
    addHugeNumbers(a1, a2, res);


    return 0;
}

我遇到的问题是,如果我输入 ex. 23 23 它输出 2346 这显然是错误的,但它得到 46 正确,当我输入 1234 123 它输出 1234246这是完全错误的。

奇怪的是,如果我输入诸如 1234r 123 之类的内容或任何其他包含字符的内容,它会输出精确的总和。

最佳答案

问题是 res=strcat(a1,a2),它所做的事情与您想象的非常不同:它将 a2 附加到 a1,并且它不会“创建”新字符串。例如,请参见cppreference.com处的strcat-定义。 :

char *strcat( char *dest, const char *src )

Appends a copy of the null-terminated byte string pointed to by src to the end of the null-terminated byte string pointed to by dest. The character src[0] replaces the null terminator at the end of dest. The resulting byte string is null-terminated.

因此,您在计算某些内容之前会操纵输入,这就是您在使用调试器时将观察到的情况。

此外,scanf("%s", &a1) 看起来很可疑;它应该是 scanf("%s", a1);。你的编译器应该警告你。

您可能会重新考虑addBigNumbers,可能会在循环中添加数字,而不是将它们转换为(以某种方式总是)之间有限的整数数据类型。这个任务对于 C 初学者来说其实没什么;取以下片段进行研究:

#define N 1000

int addHugeNumbers(char *a1, char *a2, char *res){

    char resultBuffer[N];
    int i1 = (int)strlen(a1);
    int i2 = (int)strlen(a2);
    int carryOver = 0;
    int ri = 0;
    while (i1 > 0 || i2 > 0) {  // until both inputs have been read to their beginning
        i1--;
        i2--;

        // read single digits and consider that a string might have already
        // been read to its beginning
        int d1 = i1 >= 0 ? a1[i1] - '0' : 0;
        int d2 = i2 >= 0 ? a2[i2] - '0' : 0;

        // check for invalid input
        if (d1 < 0 || d1 > 9 || d2 < 0 || d2 > 9) {
            return 0;
        }

        // calculate result digit, taking previous carryOver into account
        int digitSum = d1 + d2 + carryOver;
        carryOver = digitSum / 10;
        digitSum %= 10;

        resultBuffer[ri++] = digitSum + '0';
    }
    // write the last carryOver, if any
    if (carryOver > 0) {
        resultBuffer[ri++] = carryOver + '0';
    }

    // copy resultBuffer into res in reverse order:
    while(ri--) {
        *res++ = resultBuffer[ri];
    }
    // terminate res-string
    *res = '\0';

    return 1;
}

int main(int argc, char *argv[]) {
    char res[N];
    char a1[N/2] = "123412341234";
    char a2[N/2] = "1231";
    if (addHugeNumbers(a1, a2, res)) {
        printf("result: %s\n", res);
    } else {
        printf("invalid number.\n");
    }


    return 0;
}

关于c - 将大数字作为字符串进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50775610/

相关文章:

python - np.ascontiguousarray 与 np.asarray 与 Cython

javascript - 在字符串中寻找元素

c# - 如何使用 LINQ 从 List<Price> 中获取最接近的数字?

logic - 哥德尔、埃舍尔、巴赫打印数论 (TNT) 难题和解决方案

char(包含单词)数组冒泡排序问题(三)

objective-c - C/Objective-C printf 和 NSLog(指向 char 数组的指针)

c - 如何对二维数组使用memset?

python - 将 pandas 数据框列从带逗号的字符串转换为带点的 float 时出错

c++ - 替换字符串数组中所有出现的字母

random - 如何在fortran 90中生成[0,5]范围内的整数随机数?