`
CreazyApple
  • 浏览: 63783 次
  • 性别: 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;
}


分享到:
评论

相关推荐

    java第四章数组初识排序

    【Java数组初识与排序】 在Java编程语言中,数组是一种非常重要的数据结构,它允许我们在同一时间存储多个相同类型的数据。本章将详细介绍数组的概念、应用、排序算法以及多维数组。 ### 1. 数组概念 1.1 为什么...

    高级程序设计(实习基础类试题)

    3. 将字符串复制到新数组中,并截断多余的部分。 4. 输出处理后的字符串。 ### 19. 矩阵最小值查找 **知识点**: - 二维数组:行和列的概念 - 数据类型:整型 `int` - 条件判断:`if` 语句 **实现思路**: 1. ...

    详解计数排序算法及C语言程序中的实现

    计数排序是一种非比较型排序算法,其基本...总结来说,计数排序是一种高效但受限的排序算法,尤其适合元素范围较小的整数排序。在C语言中,可以通过数组来直观地实现该算法,但需谨慎处理内存管理和适用场景的选择。

    C语言编程题与答案.doc

    1. 分数序列求和:该题目运用了for循环来迭代序列的每一项,通过浮点型变量i和j表示分数的分子和分母,用t累加每项的和。这里的知识点有浮点型变量的使用、循环控制结构以及浮点数的相加。 2. 字符串逆序输出:这里...

    C语言二级考试题库(20211014172504).pdf

    - 字符串表示的数字可以通过逐字符转换成整数,然后进行加法运算。例如,`ctod(a)`将字符串转换为整数,`ctod(a)+ctod(b)`则表示两个字符串数字的和。 9. 循环和浮点数处理: - `fun(float h)`函数涉及到浮点数的...

    浙江大学c语言颜辉PPT课件.pptx

    定义一个字符型数组c,长度为200: ``` char c[200]; ``` 定义一个浮点型数组f,长度为5: ``` float f[5]; ``` 数组元素的引用 ---------------- 数组元素的引用格式为: ``` 数组名[下标]; ``` 其中,下标是整型...

    计算机三级网络技术机试答案.pdf

    这里使用了字符型变量`ch`存储第一个字符,然后依次将每个字符与下一个字符相加,最后将字符串反转。 10. 左移4位与字符保留:对于ASCII值小于32或大于100的字符,不做处理,保持原样。 这些代码片段展示了在实际...

    计算机二级c题库真是可靠

    - 排序算法:链表的排序(如冒泡排序、选择排序)、数组的排序(如快速排序、归并排序)。 - 回文判断:检查字符串是否正反读都一样,可以用双指针或栈实现。 8. **函数指针**: - 函数指针可以作为参数,实现...

    C#编程题 考试题库.pdf

    4. 复数类设计:这是面向对象编程的一部分,需要创建一个`Complex`类,包含两个私有浮点型变量表示实部和虚部,以及对应的公有方法:`Plus`(加法)、`Subtract`(减法)和重写的`ToString`方法。`ToString`方法用于...

    c语言复习资料整理,扎进下吧

    14. **字符型数组中的\0**:在C语言中,字符串是以`\0`作为结束标志的。 15. **字符串函数**:如`strcpy`用于复制字符串,`strcmp`比较两个字符串,`strcat`连接两个字符串。 16. **有参宏的展开运算**:宏定义如`...

    程序设计基础&#40;C语言&#41;上机考试题.doc

    - C语言支持多种基本数据类型,如整型(int)、字符型(char)、浮点型(float/double)等。 - 变量定义的一般形式为:`类型标识符 变量名;`,例如:`int a;` #### 3.2 控制结构 - **条件语句**:if-else结构用于...

    LeetCode:LeetCode题解:记录自己的算法学习过程,见证自身的成长

    7. **字符串处理**:LeetCode中有很多涉及字符串操作的题目,如检查回文、最长公共前缀、替换空格等,这可以让你熟悉字符串操作的技巧和库函数的使用。 通过参与LeetCode的练习,不仅可以提升编程技巧,还能加深对...

    C语言学习基础提升与综合训练复习题

    - 练习题中给出了几个算法的N-S流程图设计,比如求和序列、素数检测、闰年判断、物理问题模拟(落球反弹)以及排序算法(冒泡排序和简单选择排序)的流程设计。 3. **数据类型、运算符与表达式**: - 常量有整型...

    C语言习题大题答案1

    - 插入排序算法,当输入一个新整数时,保持数列从大到小的顺序。 5. **字符串操作**: - 使用`gets`函数读取含有空格的字符串,`scanf`接收删除位置,然后通过移动字符来删除指定位置的字符。 6. **函数的定义...

    c语言考试必备

    5. **变量与数据类型**:C语言中的基本数据类型包括整型(如`int`)、字符型(`char`)和浮点型(`float`、`double`)。在实验题目三中,对字符变量进行加法操作需要注意字符编码的性质。 6. **流程控制**:实验...

    全国计算机二级C语言上机题库答案

    - 分数序列求和:检查变量类型、循环条件和计算逻辑,例如将整型除法改为浮点型除法以获取准确结果。 - 变量交换:不允许增加语句,通常采用临时变量实现,注意防止数据丢失。 3. **编程题**: - 找出二维数组中...

    上海交大ACM模板,ACMer值得一看

    基数排序是一种非比较型整数排序算法,其原理是按照低位先排序,然后收集;再按高位排序,然后再收集的方式进行排序。 #### 1.12 选取第k小元素 (Select Kth Smallest Element) 这是一种在未排序的数组中找出第k个...

    理学C语言复习PPT学习教案.pptx

    学习C语言时,应掌握各种基础算法,如条件判断(三数比较、成绩分类、闰年)、循环计算(最大公约数、最小公倍数、求和、阶乘)、搜索(查找)和排序(冒泡排序、简单排序、逆序)等。 ### 8. 数组 数组是存储同...

    合肥工业大学-c++上机考试习题

    这些题目涵盖了C++编程的基础和应用,包括字符串操作、逻辑判断、循环控制、数学运算、条件语句、数组处理、函数使用以及简单的算法设计。以下是这些习题涉及的知识点的详细说明: 1. **字符串加密解密**:利用异或...

    计算机C语言

    12. **排序与查找**:C语言提供了实现排序算法(如冒泡排序、快速排序)和查找算法(如二分查找)的基础,例如对整数数组进行升序排列。 13. **矩阵操作**:矩阵可以表示为二维数组,对其进行操作如转置、求和等。 ...

Global site tag (gtag.js) - Google Analytics