【字符串处理算法】字符串包含的算法设计及C代码实现【转】

转自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587

版权声明:本文为博主原创文章,对文章内容有任何意见或建议,欢迎与作者单独交流,作者QQ(微信):245924426。

一、需求描述

输入一个由数字构成的字符串,编写程序将该字符串转换为整数并输出。

例如,如果输入的字符串是“12345”,那么输出的整数是12345。注意,不要使用C语言的库函数atoi。

二、算法设计

我们都知道,如果给定一个整数123,那么其表示方法是:123=1*100+2*10+3。也就是说,一个整数是由其各位上的数字按照位数求和组成的。

因此,这个需求的解决方法很简单,只要将字符串中的各位数字按照其位数相加就行了。在此过程中,要考虑一些特殊情况。

程序的总体流程如图1所示。

图1 程序的总体流程

三、特殊流程考虑

在编写程序的过程中,我们要对输入的数字串的长度及格式多做考虑,如:

1.如果输入的字符串中包含了除数字之外的其它字符,那么程序直接返回,不进行后续处理。

2.如果数字串是以一个或多个字符0开头的,则要先将其去掉之后再进行后续处理。

3.因为在c语言中,整型(int)所能表示的最大数为2147483647,所以如果输入的数字串大于了“2147483647”,那么程序直接返回,不进行后续处理。

四、程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160

/**********************************************************************

* 版权所有 (C)2016, Zhou Zhaoxiong。

*

* 文件名称: StrToInt.c

* 文件标识: 无

* 内容摘要: 将字符串转换为整数

* 其它说明: 例如, 将"123"转换为123

* 当前版本: V1.0

* 作 者: Zhou Zhaoxiong

* 完成日期: 20160218

*

**********************************************************************/

#include <stdio.h>

#include <limits.h> // 由于在代码中使用了INT_MAX, 因此要包含该头文件

// 重新定义数据类型

typedef signed char INT8;

typedef int INT32;

typedef unsigned int UINT32;

// 函数声明

INT32 CalIntVal(INT32 iBitLen);

INT32 JudgeIfOverFlow(INT8 *pszTestStr);

/**********************************************************************

* 功能描述: 主函数

* 输入参数: 无

* 输出参数: 无

* 返 回 值: 0-执行成功 其它-执行失败

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ---------------------------------------------------------------------

* 20160218 V1.0 Zhou Zhaoxiong 创建

***********************************************************************/

INT32 main()

{

INT8 szInputStr[100] = {0};

INT8 szTestStr[100] = {0};

INT32 iResultInt = 0; // 转换之后的整数最大支持2147483647

UINT32 iPosFlag = 0;

UINT32 iTestStrLen = 0;

UINT32 iBitVal = 0;

INT32 iRetVal = 0;

printf("Max value of int is %d\n", INT_MAX); // 求出int的最大值

printf("Please input the string: \n");

scanf("%s", szInputStr);

printf("InputStr=%s\n", szInputStr);

// 判断输入的字符串中是否有除数字之外的其它字符, 若有, 则直接退出

for (iPosFlag = 0; iPosFlag < strlen(szInputStr); iPosFlag ++)

{

if (szInputStr[iPosFlag] < ‘0‘ || szInputStr[iPosFlag] > ‘9‘)

{

printf("%s is not a digital string, please check!\n", szInputStr);

return -1;

}

}

// 如果字符串前面有字符0, 则将其去掉

iPosFlag = 0;

while (szInputStr[iPosFlag] == ‘0‘)

{

iPosFlag ++;

}

// 获取去除0之后的字符串值

strncpy(szTestStr, szInputStr+iPosFlag, strlen(szInputStr)-iPosFlag);

// 判断字符串是否大于2147483647, 若是, 则直接退出

iRetVal = JudgeIfOverFlow(szTestStr);

if (iRetVal != 0)

{

printf("%s is bigger than INT_MAX(2147483647), please check!\n", szTestStr);

return -1;

}

// 计算字符串对应的整数值

iTestStrLen = strlen(szTestStr);

iResultInt = 0;

for (iPosFlag = 0; iPosFlag < iTestStrLen; iPosFlag ++)

{

iBitVal = szTestStr[iPosFlag] - ‘0‘; // 计算每一位对应的数字

iResultInt = iResultInt + iBitVal * CalIntVal(iTestStrLen-iPosFlag);

}

printf("ResultInt=%d\n", iResultInt);

return 0;

}

/**********************************************************************

* 功能描述: 判断输入的字符串是否溢出

* 输入参数: pszTestStr-测试字符串

* 输出参数: 无

* 返 回 值: 1-溢出 0-未溢出

* 其它说明: 判断字符串是否大于2147483647, 若是, 则溢出

* 修改日期 版本号 修改人 修改内容

* ---------------------------------------------------------------

* 20160218 V1.0 Zhou Zhaoxiong 创建

***********************************************************************/

INT32 JudgeIfOverFlow(INT8 *pszTestStr)

{

UINT32 iTestStrLen = 0;

INT8 szProcessedStr[100] = {0};

INT8 szMaxValOfInt[100] = {0};

snprintf(szMaxValOfInt, sizeof(szMaxValOfInt)-1, "%d", INT_MAX); // 求出int的最大值

iTestStrLen = strlen(pszTestStr);

if (iTestStrLen > strlen(szMaxValOfInt)) // 长度超过

{

return 1;

}

else if (iTestStrLen == strlen(szMaxValOfInt)) // 长度相等

{

if (strcmp(pszTestStr, szMaxValOfInt) > 0) // 溢出

{

return 1;

}

else

{

return 0;

}

}

else // 测试字符串长度小于"2147483647"的长度, 未溢出

{

return 0;

}

}

/**********************************************************************

* 功能描述: 求字符串中的每一位所对应的整数值

* 输入参数: iBitLen-对应整数的第多少位

* 输出参数: 无

* 返 回 值: 该位所对应的整数值

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ---------------------------------------------------------------

* 20160218 V1.0 Zhou Zhaoxiong 创建

***********************************************************************/

INT32 CalIntVal(INT32 iBitLen)

{

if (iBitLen == 1) // 个位

{

return 1;

}

else

{

return 10 * CalIntVal(iBitLen-1);

}

}

来自CODE的代码片

StrToInt.c

五、程序测试

我们将编写好的程序“StrToInt.c”上传到Linux机器,并使用“gcc -g -o StrToIntStrToInt.c”命令对该程序进行编译,生成“StrToInt”文件。下面对程序进行详细的测试。

1.输入字符串为“12345”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

12345

InputStr=12345

ResultInt=12345

2.输入字符串为“-12345”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

-12345

InputStr=-12345

-12345 is not a digital string, please check!

3.输入字符串为“123456a”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

123456a

InputStr=123456a

123456a is not a digital string, please check!

4.输入字符串为“012345”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

012345

InputStr=012345

ResultInt=12345

5.输入字符串为“0123450”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

0123450

InputStr=0123450

ResultInt=123450

6.输入字符串为“2147483647”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

2147483647

InputStr=2147483647

ResultInt=2147483647

7.输入字符串为“2147483648”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

2147483648

InputStr=2147483648

2147483648 is bigger than INT_MAX(2147483647), please check!

8.输入字符串为“123456789012”时,程序运行情况如下:

Max value of int is 2147483647

Please input the string:

123456789012

InputStr=123456789012

123456789012 is bigger than INT_MAX(2147483647), please check!

可见,对于上面考虑到的几种特殊情况,程序均能做出正确的处理。

六、需求扩展

基于本文中的需求和程序,我们可考虑对需求进行以下扩展:

1.不限制输入的字符串中只能包含数字,也可以在开头包含“+”或“-”。如果字符串是以“+”开头,那么最后输出的整数是正整数;如果字符串是以“-”开头,那么最后输出的整数是负整数。

2.如果输入的数字串大于了“2147483647”,那么程序直接输出整数值为2147483647。

时间: 2024-11-05 07:27:56

【字符串处理算法】字符串包含的算法设计及C代码实现【转】的相关文章

微软数据挖掘算法:Microsoft 线性回归分析算法(11)

前言 此篇为微软系列挖掘算法的最后一篇了,完整该篇之后,微软在商业智能这块提供的一系列挖掘算法我们就算总结完成了,在此系列中涵盖了微软在商业智能(BI)模块系统所能提供的所有挖掘算法,当然此框架完全可以自己扩充,可以自定义挖掘算法,不过目前此系列中还不涉及,只涉及微软提供的算法,当然这些算法已经基本涵盖大部分的商业数据挖掘的应用场景,也就是说熟练了这些算法大部分的应用场景都能游刃有余的解决,每篇算法总结包含:算法原理.算法特点.应用场景以及具体的操作详细步骤.为了方便阅读,我还特定整理一篇目录:

【字符串处理算法】回文判断的算法设计及C代码实现

一.需求描述 输入一个字符串,编写程序判断这个字符串是否是回文串. 为了便于说明,设定输入的字符串分为中文字符串和非中文字符串两种.其中,中文字符串中仅包含中文字符,非中文字符串中不包含中文字符. 所谓回文串,是指正读和反读都一样的字符串.下面举几个例子予以说明: 1."level"是一个非中文字符的回文串,因为正读和反读都是"level". 2."Good"不是一个非中文字符的回文串. 3."我爱我"是一个中文字符的回文串,

【字符串处理算法】字符串包括的算法设计及C代码实现

一.需求描写叙述 给定一个长字符串和一个短字符串.编敲代码推断短字符串中的全部字符是否都在长字符串中.假设是,则长字符串包括短字符串:反之,不包括. 为了尽量包括大多数情况,字符串中能够包括大写和小写英文字母.数字和各种标点符号.而且区分大写和小写字母. 以下举几个样例予以说明: 1.假设长字符串是"ABCDE",短字符串是"ADC",那么短字符串中的全部字符都在长字符串中.即长字符串包括了短字符串. 2.假设长字符串是"ABCDE",短字符串是

时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法

在算法设计的时空权衡设计技术中,对问题的部分或者全部输入做预处理,对获得的额外信息进行存储,以加速后面问题的求解的思想,我们称作输入增强. 其中字符串匹配算法Horspool算法和Boyer-Moore算法就是输入增强的例子. 首先了解一下字符串匹配的概念.我们把在一个较长的n个字符的串中,寻找一个给定的m个字符的串的问题,称为字符串匹配问题.较长的串称为text,而需要寻找的串称为pattern. 字符串匹配问题的蛮力算法很好理解:我们把pattern与text第一个字符对齐,从左往右比较pa

算法--字符串移位问题

转载请标明出处http://www.cnblogs.com/haozhengfei/p/d06ff7b10334cd17ec014764b96790ca.html 字符串移位问题 字符串移位练习题 第7节 字符串移位练习题 对于一个字符串,请设计一个算法,将字符串的长度为len的前缀平移到字符串的最后. 给定一个字符串A和它的长度,同时给定len,请返回平移后的字符串. 测试样例: "ABCDE",5,3 返回:"DEABC" Java (javac 1.7) 代码

数据结构与算法---字符串(上)

   hey,you guys. 好久没有继续我们的数据结构学习了,今天让我们一起来学习,开发中非常重要的一种数据类型--字符串.关于字符串,大家应该不会陌生.例如,我们做web开发,需要校验用户输入的注册信息是否合法,或者判断用户输入的账户.密码.是否正确等等.我们通过调用字符串的相关函数,就可以解决我们的需求.古语有云:"知其然,知其所以然".我们要做的,不仅仅是会调用字符串的方法,更要明白这些方法的原理.例如,在没有学习字符串之前,我认为要比较两个字符串是否相等,只需这样: st

ACM中常用算法----字符串

ACM中常用算法--字符串 ACM中常用的字符串算法不多,主要有以下几种: Hash 字典树 KMP AC自动机 manacher 后缀数组 EX_KMP SAM(后缀自动机) 回文串自动机 下面来分别介绍一下: 0. Hash 字符串的hash是最简单也最常用的算法,通过某种hash函数将不同的字符串分别对应到不同的数字.进而配合其他数据结构或STL可以做到判重,统计,查询等操作. #### 字符串的hash函数: 一个很简单的hash函数代码如下: ull xp[maxn],hash[max

[算法]字符串左移k位

如,abcde左移3位为deabc 要求时间复杂度O(n),空间复杂度O(1),每一个字符只能遍历一次 摘自http://blog.csdn.net/geniusluzh/article/details/8460031 利用数学解决该问题 其实对于这道题,最初一看的想法就是将当前位依次替换左移m位对应的那个位,然后依次替换.后来发现有的情况一次循环替换就能全部完成整个串的左移,而有的情况下会出现多个循环链,一时只得到规律,不能想到很好的证明办法,只怪以前初等数论没有好好学啊! 我们发现对于长度为

编程算法 - 字符串的排列 代码(C)

字符串的排列 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个字符串, 打印出该字符串中字符的所有排列. 方法: 使用递归依次交换位置, 打印输出. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> void Permutation(char* pStr, char

数据结构与算法---字符串(下)

前面两篇文章,分别介绍了字符串的概念.抽象数据类型.KMP模式匹配算法.这篇文章,我们来学习字符串的一些常用算法. 字符串的相关操作算法 StrAssign: /* 功能:生成一个其值等于Chars的串T */ Status StrAssign(String T, char *chars) { int i; if (chars[0] > MAXSIZE) return ERROR; T[0] = chars[0]; //chars[0]存放的是字符chars的长度 T[0]存放着的是串T的长度