您的位置:首页 > 其它

字符型数组表示大整数 并排序、求和(华科保研机试)

2012-09-06 15:43 99 查看


/* 建立一种数据结构,可以存储任意个、任意长度的整数,
* 利用这个数据结构,输入一串数,排序,求累加和
* 思路:用以链表表示,用字符型数组表示大整数 链头存储和 */
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐