输入两个正整数,求它们的差
【算法分析】
类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加,如下图所示:
分析C数组下标的变化规律,可以写出如下关系式:ci = c’i +c”i +…由此可见,ci与a[i]*b[i]乘积有关,跟上次的进位有关,还跟原ci的值有关,分析下标规律,有c[i+j-1]= a[i]*b[j]+ x + c[i+j-1]; x=c[i+j-1]/10 ; c[i+j-1]%=10;。
【参考程序】
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a1[101], b1[101];
int a[101], b[101], c[10001], lena, lenb, lenc, x;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
scanf("%s", a1); // 一本通网站提交代码,使用gets(a1),运行“未通过”!
scanf("%s", b1);
lena = strlen(a1);
lenb = strlen(b1);
for (int i=0; i<lena; i++) {
a[lena-i] = a1[i] - 48;
}
for (int i=0; i<lenb; i++) {
b[lenb-i] = b1[i] - 48;
}
for (int i=1; i<=lena; i++) { // 对被乘数的每一位进行处理
x = 0; // 用于存放进位
for (int j=1; j<=lenb; j++) { // 对乘数的每一位进行处理
c[i+j-1] = a[i]*b[j] + x + c[i+j-1]; // 当前乘积+上次乘积进位——原数
x = c[i+j-1] / 10;
c[i+j-1] %= 10;
}
c[i+lenb] = x; // 进位
}
lenc = lena + lenb;
while (c[lenc]==0 && lenc>1) { // 删除前导0
lenc--;
}
for (int i=lenc; i>=1; i--) {
cout << c[i];
}
return 0;
}