`
CreazyApple
  • 浏览: 61879 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

/* 建立一种数据结构,可以存储任意个、任意长度的整数,
 * 利用这个数据结构,输入一串数,排序,求累加和 
 * 思路:用以链表表示,用字符型数组表示大整数 链头存储和 */
#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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics