/* 建立一种数据结构,可以存储任意个、任意长度的整数,
* 利用这个数据结构,输入一串数,排序,求累加和
* 思路:用以链表表示,用字符型数组表示大整数 链头存储和 */
#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;
}
字符型数组表示大整数 并排序、求和(华科保研机试)
最新推荐文章于 2022-09-12 11:03:06 发布