数据结构作业2版

数据结构作业2版

//做到一半就懵了,有bug不想改了
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
//只做了加减,越想越炸,边查边问给搞出来的,懵了已经 
typedef struct acc{ 
	int *da; // 第一个为小数部分 后面为整数部分  应该是一个数组
	int len; //da的数据个数 
}acc; 

//字符转整数 
int chrToInt(char *a,int q,int h){
	int res=0;
	int t=1;
	for (int i=h;i>=q;i--){
		if (a[i]=='\0'){
			break;
		}
		res+=(a[i]-'0')*t;
		t*=10;
	}
	return res;
}

//  返回一个acc对象
acc* initAcc(char str[],int ln){
	int *dat; 
	acc* a=(acc *)malloc(sizeof(acc));
	int t,txa;// 包含小数的总长度  小数点位置
	txa=0;
	if (ln==0) {// 使用字符串初始化 
		t=0;
		for (int i=0;;i++){
			if(str[i]!='\0' && str[i]!='.'){
				t++;
			}else if(str[i]=='.'){
				txa=i;
			}else if(str[i]=='\0'){
				break;
			}
		}
	}else{//使用长度 
		t=ln;
	} 
	
	
	a->len=t/4+2;
	printf("%d  %d  %d\n",t,txa,a->len);
	a->da=(int *)malloc(sizeof(int)*(a->len));//  申请 整数存储数组 
	dat=a->da;
	if(ln==0){// 使用字符串初始化 
		if (txa!=0){//  把小数存到第一个位置  更新整数部分的位置 
		*dat=chrToInt(str,txa+1,t);
		for(int i=0;i<4-t+txa;i++){
			*dat*=10;
		}
		t=txa;
		}
		else *dat=0;
		dat++;
		for(int i=t-1;i>=0;i-=4){ //  整数存放 
			*dat=chrToInt(str,i-3>0?i-3:0,i);
			dat++;
		}
	}else{//使用长度初始化 
		for(int i=0;i<a->len;i++){
			*dat=0;
			dat++;
		}
	}
	
	return a;
}
void showAcc(acc *a){// 打印 数 
	int *a1=a->da+(a->len-1);
	for(int i=0;i<a->len-1;i++){
		if(*a1>0) printf("%d ",*a1); //打印整数部分 
		a1--;
	}
	if(*a1>0)printf(". %d",*a1);//打印小数部分
	printf("\n"); 
}
acc* addAcc(acc *a,acc *b){
	int l=a->len>b->len ? a->len:b->len;  //  取长度最长的数 
	int *a1,*b1,*c1;//  数组指针   指数据的
	int a2,b2; 
	int tc;
	acc *c=initAcc("",l*4);//  初始化一个能放下结果的 
	a1=a->da;a2=*a1;
	b1=b->da;b2=*b1;
	c1=c->da;
	tc=0;
	for(int i=0;i<l;i++){//加计算 
		tc=a2+b2+tc;
		*c1=tc%10000;
		tc/=10000;
		c1++;
		if(i>=a->len-1){
			a2=0;
		}else{
			a1++;
			a2=*a1;
		}
		if(i>=b->len-1){
			b2=0;
		}else{
			b1++;
			b2=*b1;
		}
	} 
	return c;
}

acc* jianAcc(acc *a,acc *b){
	int l=a->len>b->len ? a->len:b->len;  //  取长度最长的数 
	int *a1,*b1,*c1,*a2,*b2;//  数组指针   指数据的 
	int tc;
	acc *c=initAcc("",l*4);//  初始化一个能放下结果的
	a2=(int *)malloc(sizeof(int)*(a->len));//  复制一个出来  因为要操作的 
	b2=(int *)malloc(sizeof(int)*(b->len));
	memcpy(a2,a->da,sizeof(int)*(a->len));
	memcpy(b2,b->da,sizeof(int)*(b->len)); 
	a1=a2;
	b1=b2;
	c1=c->da;
	tc=0;
	for(int i=0;i<l;i++){//减计算 
		if (*a1>=*b1){
			*c1=*a1-*b1;
		}else{
			*c1=*a1+10000-*b1;
			*(a1+1)-=1;
		} 
		c1++;
		if(i>=a->len-1){//末尾 停止 
			*a1=0;
		}else{
			a1++;
		}
		if(i>=b->len-1){// 末尾停止 
			*b1=0;
		}else{
			b1++;
		}
	} 
	free(a2);
	free(b2);
	return c;
}

int main(){
	//测试 
	acc *a,*b,*c,*d;
	a=initAcc("012345698.95",0);
	b=initAcc("345698.95",0);
	c=addAcc(a,b);
	d=jianAcc(c,a);
	printf("a ");
	showAcc(a);
	printf("b ");
	showAcc(b);
	printf("c ");
	showAcc(c);
	printf("d ");
	showAcc(d);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值