字符型数组表示大整数 并排序、求和

/* 建立一种数据结构,可以存储任意个、任意长度的整数,
 * 利用这个数据结构,输入一串数,排序,求累加和 
 * 思路:用以链表表示,用字符型数组表示大整数 链头存储和 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _Node{
    char *data;
    int length;
    struct _Node *next;
}Node;

char *GetSum(char *,char *);
int CompareData(char *a,char *b);
Node* InitList(void)
{
    Node *L = (Node *)malloc(sizeof(Node));
    L->data = "0";
    L->length = 0;
    L->next = NULL;

    return L;
}
/* 把一个字符数组插入到链表中,而且从小到大排序 */
int Insert(Node *L, char *a)
{
    int pos = 0;
    Node *p = L;

    if(!L)return 1;

	Node *newNode = (Node *)malloc(sizeof(Node));
	newNode->length = strlen(a);
	newNode->data = a;
	newNode->next = NULL;

    while(p->next && CompareData(a,p->next->data)>=0) p = p->next;
	newNode->next = p->next;
    p->next = newNode;

	L->data = GetSum(L->data,a);//头结点存储和
    L->length++;//设头结点,length存储数字个数
}
void Tranverse(Node *L)
{
    Node *p = L->next;
    if(!L)return;

    printf("Sum : %s\nNumber of data : %d\n\n",L->data,L->length);

    while(p)
    {
        printf("%s\t%d\n",p->data,p->length);
        p = p->next;
    }
    printf("\n");
}
/* 比较两个数的大小,返回值:
 * 1:a>b  0:a=b  -1:a<b */
int CompareData(char *a,char *b)
{
	if(strlen(a) > strlen(b))return 1;
	if(strlen(a) < strlen(b))return -1;
	return strcmp(a,b);
}
char* GetSum(char *a,char *b)
{
	int m,carry=0,s=0;
	int pos_a = strlen(a)-1,pos_b=strlen(b)-1;
	int pos_c = pos_a>pos_b?pos_a:pos_b;
	int i=pos_a,j=pos_b,k=pos_c;	
	char *c = (char *)malloc(sizeof(char)*(pos_c)+1);

	for(;i>=0 && j>=0;i--,j--,k--)
	{
		m = a[i] + b[j] - 2*'0' + carry;
		carry = m/10;
		c[k] = m>9 ? m-10+'0' : m+'0';
	}
	for(;i>=0;i--,k--)
	{
		m = a[i] - '0' + carry;
		carry = m/10;
		c[k] = m>9 ? m-10+'0' : m+'0';
	}
	for(;j>=0;j--,k--)
	{
		m = b[j] - '0' + carry;
		carry = m/10;
		c[k] = m>9 ? m-10+'0' : m+'0';
	}

	char *sum = (char *)malloc(sizeof(char)*(carry?pos_c+3:pos_c+2));
	if(carry){
		sum[0]='1';
		s++;
	}
	for(m=0;m<=pos_c;)sum[s++]=c[m++];
	sum[s]='\0';
	return sum;
}
int main(int argc, char *argv[])
{
	int i ;
    Node *L = InitList();

	for(i=1;i<argc;i++)
		Insert(L,argv[i]);

    Tranverse(L);
	getchar();
    return 1;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值