我有一段用C语言编写的代码,可以像人类一样进行加法运算。例如,如果我有两个数组A[0..n-1]
和B[0..n-1]
,那么该方法将执行C[0]=A[0]+B[0]
、C[1]=A[1]+B[1]
...等操作。
我需要帮助使这个函数更快,即使解决方案使用了内部函数。
我的主要问题是存在一个非常大的依赖关系问题,因为迭代i+1依赖于迭代i的进位,只要我使用10进制。所以如果A[0]=6
并且B[0]=5
,则C[0]
必须为1
,并且我会有下一个加法的进位1
。
我能够编写的更快的代码如下:
void LongNumAddition1(unsigned char *Vin1, unsigned char *Vin2,
unsigned char *Vout, unsigned N) {
for (int i = 0; i < N; i++) {
Vout[i] = Vin1[i] + Vin2[i];
}
unsigned char carry = 0;
for (int i = 0; i < N; i++) {
Vout[i] += carry;
carry = Vout[i] / 10;
Vout[i] = Vout[i] % 10;
}
}
但是我也尝试了这些方法,结果变得更慢了:
void LongNumAddition1(unsigned char *Vin1, unsigned char *Vin2,
unsigned char *Vout, unsigned N) {
unsigned char CARRY = 0;
for (int i = 0; i < N; i++) {
unsigned char R = Vin1[i] + Vin2[i] + CARRY;
Vout[i] = R % 10; CARRY = R / 10;
}
}
void LongNumAddition1(char *Vin1, char *Vin2, char *Vout, unsigned N) {
char CARRY = 0;
for (int i = 0; i < N; i++) {
char R = Vin1[i] + Vin2[i] + CARRY;
if (R <= 9) {
Vout[i] = R;
CARRY = 0;
} else {
Vout[i] = R - 10;
CARRY = 1;
}
}
}
我在谷歌上进行了一些研究,发现了一些类似于我已经实现的伪代码,同时在GeeksforGeeks里面也有另一个解决这个问题的实现,但是速度更慢。
你能帮我吗?
if (a+b > 9) carry = 1; else carry = 0;
- pmguint_fast32_t
,因为这样您就需要进行更少的“真正的”加法来执行加法操作。你也许想要查看一下在 .net core 中它是如何实现的,可以查看。 - Ackdariuint32_t
。 - Andrew Henle