本次实现的一些想法
大数加法实现采用数组来完成,网上常见的代码在定义变量的时候常采用这种形式
int in1[N],in2[N],ans[N];
int in1_size,in2_size,ans_size;
int i,j,k;
如这位兄台的C语言大数加法
我在实现时使用结构体将三个数组重新做封装,size指向数组的实际有效位数,而pos指向本次操作的物理位置。变量定义如下:
struct{
char dat[N];
int size; //有效逻辑长度
int pos; //总是指向本次操作的物理位置
//数组的使用方式一般有两种:start-》pos 和 pos->end
}in1,in2,ans; //这样子定义实际上限制了灵活性
如假如我想在读出in1数组的第一个元素,那么我先得将pos指向0,之后在通过这样的方式去操作in1.dat[in1.pos]。又如我若是要遍历out数组,则采用如下方式:
for(in1.pos=0;in1.pos<in1.size;in1++) putchar(in1.dat[in1.pos]);
这种方式说实话,不见得能将代码简化,甚至可能都不能将思路简化,但是还挺有意思的:我在我重新定义的世界坐标系中去code,这种思路可以见我的另一个博客贪吃蛇 C实现细节。所有的代码如下:所有的代码如下:
#include<stdio.h>
#include<string.h>
#define N 100
struct{
char dat[N];
int size; //有效逻辑长度
int pos; //总是指向本次操作的物理位置
//数组的使用方式一般有两种:start-》pos 和 pos->end
}in1,in2,ans; //这样子定义实际上限制了灵活性
int high=0; //最高位进位与否
int main(){
int i,j,k,l,m;
int flag,temp;
gets(in1.dat);
gets(in2.dat);
in1.size=strlen(in1.dat);
in2.size=strlen(in2.dat);
ans.size=in1.size>in2.size?in1.size:in2.size;
in1.pos=0;
in2.pos=0;
flag=0;//标识当前位是否有进位
for(;in1.pos<in1.size;in1.pos++) in1.dat[in1.pos]-=48;
for(;in2.pos<in2.size;in2.pos++) in2.dat[in2.pos]-=48;
in1.pos--;
in2.pos--;
flag=0;
ans.pos=ans.size-1;
for(;;in1.pos--,in2.pos--,ans.pos--){
temp=in1.dat[in1.pos]+in2.dat[in2.pos]+flag;
ans.dat[ans.pos]=(temp)%10;
flag=0;
flag=temp/10;
if(in1.pos==0) break; //代表某个完全加完,应注意还遗留有一位进位
if(in2.pos==0) break;
}
in1.pos--;
in2.pos--;
ans.pos--; //全部指向下一位,因为还可能没有处理完整
if(in1.pos!=in2.pos){
// printf("?%d?",flag);
if(in1.pos==-1){
for(;in2.pos>=0;in2.pos--,ans.pos--) {
temp=in2.dat[in2.pos]+flag;
ans.dat[ans.pos]=temp%10;
flag=0;
flag=temp/10;
}
}else{
for(;in1.pos>=0;in1.pos--,ans.pos--) {
temp=in1.dat[in1.pos]+flag;
ans.dat[ans.pos]=temp%10;
flag=0;
flag=temp/10;
}
}
} //这样子处理虽然很巧妙,但是很容易造成以往
ans.pos=0;
high=flag;
for(;ans.pos<ans.size;ans.pos++) ans.dat[ans.pos]+=48;
if(high==1){
putchar('1');
}
ans.dat[ans.size]='\0'; //将char数组转为str
puts(ans.dat);
return 0;
}