操纵大数字作为字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操纵大数字作为字符串相关的知识,希望对你有一定的参考价值。
我有一个问题:
创建一个将大整数作为字符串输入的C程序。 然后将每个字符转换为相应的数字。
之后我必须创建一个有3个矩阵的函数addBigNumbers()
。
addBigNumbers(char *a1, char *a2, char *res)
a1和a2将包含我想要添加的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
,并且它不会“创建”一个新的字符串。例如,参见strcat
的cppreference.com定义:
四个*级别(四个* Dest,Const四个* Charsi)
将src指向的以null结尾的字节字符串的副本附加到dest指向的以null结尾的字节字符串的末尾。字符src [0]替换dest末尾的空终止符。生成的字节字符串以空值终止。
因此,在计算某些内容之前,您正在操纵输入,这是您在使用调试器时将要观察到的内容。
此外,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 = ' ';
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
", res);
} else {
printf("invalid number.
");
}
return 0;
}
以上是关于操纵大数字作为字符串的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段