从字符串中筛选出连续的数字,并将其放入另一个数组!
2012-12-02 18:58
253 查看
题目(摘自谭克强版C语言): 输入一个字符串,内有数字和非数字字符,如a123x456as789x123,将其中连续的数字作为一个整数,依次存放到数组a中,例如存放123在a[0]中,并统计共有多少个这样的整数,并且输出。
算法:我在网上找了这个题的算法,基本上都是按照老谭的那样算的,说实话我没太看懂老谭的代码,感觉很乱,他的思路到是可以借鉴。所以我写了自己的算法,高手路过还请多多指点。老谭是从前往后遍历的去寻找数字,为此他付出了很大的代价去寻找元素位置与连续数字位数之间的关系,导致代码死多,都不想看。为了方便期间,我选择逆序遍历,逆序的好处显而易见。比如上面的字符串,首先肯定是先将数字字符转换成整型(因为要放在整型数组里啊),我从最后一位3开始访问,无论如何它都是个位(不管下一位是不是数字),如果下一位是数字,那就换算成十位(即乘以10),再求sum,继续判断第三位,第三位乘100,再相加,就是123了;而如果从前往后的话不能这么简单的去换算,因为你不知道这个连续数字有几位,因而无法确定个位十位等(当然,这可以利用元素的位置和连续数字的位置之间的关系得出,但我觉得麻烦)。算法基本就这样,不过还得注意一点就是,因为是逆序,我原本的想法是将字符串的最后一个'\0'放在最前面,即其余元素全部向后移动一位,但是考虑到万一数据很大,那不是复杂度太大了么,于是我选择构造新的字符串,即在输入字符串的时候要求第一位输入一个任意字符,然后将最后一个字符'\0'(这个字符是在最后一位3的下一位,是系统自动分配的)赋值给它,这样就貌似''翻转''了字符串。所以我这个程序输入得格式是,任意一个字符+真正输入的字符。代码如下:
有时候觉得C语言也很蛋疼,没有String类,像这种问题放在其他高级语言里,用个substring就方便多了,不过底层语言也有底层语言的好处,毕竟要有坚实的基础才能爬的更高么。
算法:我在网上找了这个题的算法,基本上都是按照老谭的那样算的,说实话我没太看懂老谭的代码,感觉很乱,他的思路到是可以借鉴。所以我写了自己的算法,高手路过还请多多指点。老谭是从前往后遍历的去寻找数字,为此他付出了很大的代价去寻找元素位置与连续数字位数之间的关系,导致代码死多,都不想看。为了方便期间,我选择逆序遍历,逆序的好处显而易见。比如上面的字符串,首先肯定是先将数字字符转换成整型(因为要放在整型数组里啊),我从最后一位3开始访问,无论如何它都是个位(不管下一位是不是数字),如果下一位是数字,那就换算成十位(即乘以10),再求sum,继续判断第三位,第三位乘100,再相加,就是123了;而如果从前往后的话不能这么简单的去换算,因为你不知道这个连续数字有几位,因而无法确定个位十位等(当然,这可以利用元素的位置和连续数字的位置之间的关系得出,但我觉得麻烦)。算法基本就这样,不过还得注意一点就是,因为是逆序,我原本的想法是将字符串的最后一个'\0'放在最前面,即其余元素全部向后移动一位,但是考虑到万一数据很大,那不是复杂度太大了么,于是我选择构造新的字符串,即在输入字符串的时候要求第一位输入一个任意字符,然后将最后一个字符'\0'(这个字符是在最后一位3的下一位,是系统自动分配的)赋值给它,这样就貌似''翻转''了字符串。所以我这个程序输入得格式是,任意一个字符+真正输入的字符。代码如下:
#include <stdio.h> #include <string.h> void main() { char num[50]; //要输入的字符串 char*p; //指向字符串 int a[50],*pa; //要存放的目的数组 int len; //用户输入的字符串的长度 int i,j; //用以遍历 int n=0; //记录连续数字的位数 int integer; //记录转换后的整型 int e10; //10 int sum=0; //求和 int l=0; //记录新数组的实际个数 printf("请输入一个字符串:\n"); gets(num); len=strlen(num); num[0]=num[len]; //先将'\0'置换到首位,用以逆向遍历 p=num+len-1; //指向最后一个元素 pa=a; //指向要赋值的数组 while(*p!='\0') { if (*p>='0' && *p<='9') { n++; //位数加1 integer=*p-48; //转换为整型 if (n>0) //至少要为1位数 { e10=1; for (j=1;j<n;j++) { e10 *=10; } integer=integer*e10; } sum=sum+integer; if (*(p-1)=='\0') //这个情况很特殊,是说连续数字出现在第二个位置上(第一个是'\0') { *pa=sum; l++; } p--; } else //这个else很重要 { if (n>0) //避免访问倒数第一个非数字出现错误赋值 { *pa=sum; //当前访问到了非数字,说明之前的是数字,把之前的存入数组 sum=0; //访问到了非数字,赶紧将sum清0,不要影响下次赋值 pa++; //指向下一个数组元素,以方便下次赋值 l++; //新数组元素的个数加1 n=0; //将位数重新赋0,如果下一个还是数字,以方便记录位数,很重要 p--; //访问下一位 } } } pa=a+l-1; //倒序 printf("字符串里的有%d个整数\n",l); printf("它们是:\n"); for(j=0;j<l;j++) {printf("%d,",*pa--);} }
有时候觉得C语言也很蛋疼,没有String类,像这种问题放在其他高级语言里,用个substring就方便多了,不过底层语言也有底层语言的好处,毕竟要有坚实的基础才能爬的更高么。
相关文章推荐
- 输入一个字符串,将其中连续的数字作为一个整数,一次存放到另一个整型数组,设计一个函数,把指向字符串的指针和指向整数的指针作为函数形参
- 输入字符串取出字符串中的连续数字放入单独数组
- 输入一个字符串,将其中的连续数字字符组成整数,并放入数组中,在主函数中打印这个数组及数组的个数。
- 编程实现:从字符中获取连续数组序列,如字符串"a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"中可以得到的连续数字序列为1234556.【注】:只考虑一位,因此最长的数
- C输入一个字符串,将其中连续的数字做为一个整数存放在一个整形数组中,统计其中数字的个数并输出这些整数。
- 习题 8.16 输入一个字符串,内有数字和非数字字符,将其中连续的数字作为一个整数,依次存放到一数组a中。统计共有多少个整数,并输出这些数。
- 把字符串里面连续的数字依次存放到一个数组中
- 输入一个字符串,内有数字和非数字字符,将其中连续的数字作为一个整数,依次存放到一数组a中。统计共有多少个整数,并输出这些数。
- •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- 2.•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- 输入一个字符串,内有数字和非数字字符,例如 A123x456 17960? 302tab5876 操作:将连续的数字作为一个整数,一次存放到一数组a中,例如123存放在a【0】中,456放在a【1】中
- •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- 有一个字符串,如"11.2美元34人民币";如何将数字与单位分开,放入数组中呢,数组比如 attr[0]=11.2 attr[1]=美元 ,依次类推
- 输入一个字符串内有数字和非数字字符,将连续的数字作为一个整数,存到数组a中,统计整数的个数,并输出这些数
- 输入字符串,内有数字和非字符数组,例如A123x456将其中连续的数字作为一个整数,依次存放到一个数组中,如123放到a[0],456放到a[1],并输出a这些数
- C 输入一个字符串,将其中连续的数字作为一个整数存到一数组中,统计整数个数并输出这些整数
- 获取字符串中的数字,放入数组并对其求和
- js如何判断一组数字是否连续,得到一个临时数组[[3,4],[13,14,15],[17],[20],[22]];
- 找出一个字符串中最长的连续数字子串,输出该字符串及长度
- 字符串中找出连续最长的数字子串,并返回这个数字串的长度