工作中遇到个问题比较烦人,希望高手能帮忙想个好算法!!不胜感激!
有一堆字符串,分别是:“42949672953” ,“ Ethernet3/1”, “ 00065800000”, “ 3687”, “ 45AD”, "53EF",、、、、、、、在很多很多这种数据堆中分捡出纯数字的串,和含有字母的串,要求是:不拆分字符进行比较运算!!(因为数据量超级大,这样效率狂低)(linux下C语言做),,,
----------------解决方案--------------------------------------------------------
工作中遇到个问题比较烦人,希望高手能帮忙想个好算法!!不胜感激!
有一堆字符串,分别是:“42949672953” ,“ Ethernet3/1”, “ 00065800000”, “ 3687”, “ 45AD”, "53EF",、、、、、、、在很多很多这种数据堆中分捡出纯数字的串,和含有字母的串,要求是:不拆分字符进行比较运算!!(因为数据量超级大,这样效率狂低)(linux下C语言做),,,
不拆分字符进行比较运算?
那还有别的办法吗?
c有没有专门的函数??
您找下看看,
----------------解决方案--------------------------------------------------------
我们曾用这个方法测试过:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%d\n",atoi(argv[1]));
return 0;
}
运行如下:
[bl@ncview test]$ ./test 5456321
5456321
[bl@ncview test]$ ./test fsdfa3200
0
[bl@ncview test]$ ./test 123365594999
2147483647
[bl@ncview test]$ ./test 000325fda
325
根据纯数字和非纯数字 字串返回的结果差异,来分别取原串与结果串的长度进行比较的方法,1、纯数字返回长度与结果长度一致,2、带0的数字可以加上取零的个数来比较长度.3、含字母的串返回为0或返回数字,其长度小于结果。。按这样的思路本来可以解决,但问题正如第三条运行结果一样,较长的纯数字串有溢出(或许不是溢出),结果与源串长度不同,就算用atoll转换,%llu输出,照样不能得到与源串相同的串。。望高手指点一二,或有其它算法!!!!谢谢了!!
----------------解决方案--------------------------------------------------------
//仅供参考,不敢说高效率
#include<stdio.h>
#include<string.h>
void main( )
{ char a[]="0123456789";
char s[80],*p;
do
{
gets(s);
p=strtok(s,a);
if(p==NULL)
printf("pure digits\n");
else
printf("include alphabet\n");
}
while(1);
}
----------------解决方案--------------------------------------------------------
int fun(char *str)
{
while(*str)
{
if(*str<'0'||*str>'9')return 0;
str++;
}
return 1;
}
----------------解决方案--------------------------------------------------------
斑竹的不是有拆分来比较吗
----------------解决方案--------------------------------------------------------
或者:
int fun(char *str)
{ int i =0;
while(*str)
{
if(*str < '0' || *str > '9')
i++;
}
if(i == strlen(*str))
return 1;
else
return 0;
}
----------------解决方案--------------------------------------------------------
斑竹的时间复杂度为O(n),要是拆分的话,时间复杂度为O(2n)or O(n)。
----------------解决方案--------------------------------------------------------
或者:
int fun(char *str)
{ int i =0;
while(*str)
{
if(*str < '0' || *str > '9')
i++;
}
if(i == strlen(*str))//你知道这个strlen是怎么实现的么?
return 1;
else
return 0;
}
----------------解决方案--------------------------------------------------------
atoi,strtok也好,都是要分解遍历字符串的
----------------解决方案--------------------------------------------------------