大数相加的另外一种思路
1;这个思路是我一学长告诉我的,然而我因为有个语法知识没用好导致初始化0(数字零)没成功,后来还是学长帮我敲完的,原来那个归零要转化为int类型的数组来完成的,这项工作。看来我需要去问问度娘
memset函数的使用了。
memset函数的使用,原型为void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
对字符串使用,使用该函数来初始化,此时的0是空零’\0’
对int数组使用,则这里的0就是数字0了;
不说闲话了,先介绍一下这个思路。
2;我之前的博客就说过以字符串输入,那么高位就是数组前面的数,因此我们的运算都是从后面开始往前面进行运算的,然而这种方法就是从前面开始运算的,当然那必须还要一项工作就是反向也就将字符串掉
头,这里可以用一个strrev就轻松完成了,
strrev的使用情况,
头文件是#include<string.h>
功能:把字符串s的所有字符的顺序颠倒过来(不包括空字符NULL);
说明:返回指向颠倒顺序后的字符串指针。
我当时就出错,我一直以为要用一个指针去接收这个掉头了的地址,后面就要用到指针所以始终报错,然而是我没记清,其实这个函数没有必要去用新的去接收它,它其实就是原字符串的地址,也就说strrev(a);之后我们再继续使用a,这个a字符串就是已经颠倒了的;
返回指向颠倒顺序后的字符串指针。这个指针表示的也就是原来的地址;
#include<stdio.h>
#include<string.h>
int main()
{
char a[10] = {'a','x','s'}, *aa;
printf("%p\n",a);
printf("%s\n",a);
aa = strrev(a);
printf("%p\n",aa);
printf("%s\n",a);
return 0;
}
输出的两个地址值是相同的。很好的解释了上面。
这些问题都解决了,再对这种方法就好敲多了。感觉都可以直接摆代码了,在代码里面去理解了。
先看一下我那个出来bug的代码吧,随后就摆出我学长打的代码;
//输入两个正的大数,输出前一个加后一个的结果;
这个是出了问题的代码;
#include<stdio.h>
#include<string.h>
int main()
{
int lena, lenb, max, mwh, i, n, jws, bj[1004]={0};
char a[1004]={0},b[1004]={0};
scanf("%d",&n);
while(n--){
memset(a, 0, sizeof(a));//不能按我那样初始化为0.这里的初始化为0是空字符'\0'
memset(b, 0, sizeof(b));
scanf("%s",a);
scanf("%s",b);
strrev(a);
strrev(b);
// printf("%s\n",a);
// printf("%s\n",b);
lena = strlen(a);
lenb = strlen(b);
max = lena;
if(lenb > max){
max = lenb;
}
jws = 0;
for(i = 0; i < max; i++){
printf("%c\n",b[i]);//这里输出不对,表示上方初始化0没有成功
mwh = (a[i]-'0')+(b[i]-'0')+jws;
if(mwh > 9){
mwh = mwh%10;
jws = 1;
}
else jws = 0;
bj[i] = mwh;
// printf("%d\n",bj[i]);
}
if(jws == 1){
bj[i] = 1;
i++;
}
for(i--; i != -1; i--){
// printf("%d",bj[i]);
}
printf("\n");
}
return 0 ;
}
接下来的才是我学长打的代码;他用的是c++;并且我也写了一点注释;
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n;
int maxi(int aaa,int bbb)
{
return aaa>bbb?aaa:bbb;
}
int main()
{
char a[1004],b[1004];
int aa[1004],bb[1004],cc[1005];
scanf("%d",&n);
while(n--)
{
memset(aa, 0, sizeof(a));//这里就可以初始化为0;
// printf("%s\n",aa);
memset(bb, 0, sizeof(b));
memset(cc,0,sizeof(cc));
scanf("%s",a);
scanf("%s",b);
int rel=0,re=0;
for(int i=strlen(a)-1;i>=0;i--)//将字符串变成整形
{
aa[rel++]+=a[i]-'0';
}
for(int i=strlen(b)-1;i>=0;i--)
{
bb[re++]+=b[i]-'0';
}
int maxn=maxi(re,rel);
for(int i=0;i<maxn;i++)//相加,后面单独来同一进位;
{
//printf("%d\n",aa[i]);//如果第一个数长度要小,那么计算不是公共部分时这里会是0.
//我之前的那个代码也就是这里没成功;
cc[i]=aa[i]+bb[i];//因为已经初始化为0了,所以可以这样一直加下去。
}
for(int i=0;i<maxn-1;i++)//统一来进位 ;
{
if(cc[i]>9)
{
cc[i+1]+=cc[i]/10;
cc[i]%=10;
}
}
printf("%d",cc[maxn-1]);
for(int i=maxn-2;i>=0;i--)
{
cout<<cc[i];
}
}
return 0 ;
}