能力值:
(RANK:1060 )
2 楼
不知道为什么考这个。。。估计要现场而且要一次通过
能力值:
(RANK:170 )
3 楼
感觉只要知道一些字符编码知识,逻辑没有问题,就很块可以做出来,这应该是简单题:P,我花了10分钟不到,还是因为修改格式的
问我的兄弟主要是没有把那个数字串连起来的整体考虑,然后写了n多代码..........
能力值:
( LV12,RANK:770 )
4 楼
呵呵,我是容易的做不对,难的又不会...
能力值:
( LV4,RANK:50 )
5 楼
#include <stdio.h>
#include <stdlib.h>
int sum(const char *str)
{
int s=0;
do
{
s+=atoi(str);
while(*str>='0' && *str<='9') ++str;
}while(*str++);
return s;
}
void main(int argc,char **argv)
{
if(argc==2) printf("%d\n",sum(argv[1]));
}
能力值:
( LV2,RANK:10 )
6 楼
很适合当高级管理人员!
能力值:
( LV9,RANK:490 )
7 楼
不难~~
能力值:
( LV13,RANK:370 )
8 楼
如果参数字符串中带有符号可能会出错
能力值:
( LV2,RANK:10 )
9 楼
DFA的问题了......
S->aS
a为0-9
用确定性有穷自动机搞定...不知道行不行
能力值:
( LV13,RANK:370 )
10 楼
呵呵,编译原理来了
能力值:
(RANK:170 )
11 楼
dwing的思路和我一样,都是截断字符串计算,但是实现看起来清爽很多:)
问题:
1。实现时有错误,看了下atoi的实现,如果输入字符中有两个--相连的时候,atoi会跳过该数字,如 "aker--9=10"只会计算10
2。另外感觉dwing每次调用atoi还是有些不好,稍微改了下,主要是加了个判断,这样就会少调用很多次atoi了。
int sum(const char *str)
{
int s=0;
do
{
if(*str>='0' && *str<='9')
{ // 如果是数字则试图计算
s+=atoi(str);
do
++str;
while(*str>='0' && *str<='9'); // 该数字串已计算,跳过数字
}
}while(*str++);
return s;
}
但是"--"的问题还存在,需要修改判断条件
感觉我的那个老实的程序没错;)
能力值:
(RANK:170 )
12 楼
感觉dwing的程序如果自己实现atoi,并且加上判断的话就比较完美了
能力值:
( LV4,RANK:50 )
13 楼
嗯,如果考虑"+"和"-",把:
s+=atoi(str);
换成:
if(*str>='0') s+=atoi(str);
#include <stdio.h>
#include <stdlib.h>
int sum(const char *str)
{
int s=0;
do
{
if(*str>='0') s+=atoi(str);
while(*str>='0' && *str<='9') ++str;
}while(*str++);
return s;
}
void main(int argc,char **argv)
{
if(argc==2) printf("%d\n",sum(argv[1]));
}
输入:"aker--9=++10"
输出:19
程序的目标是尽量简单,如果要考虑极高效率,atoi就要自己写了.
能力值:
(RANK:170 )
14 楼
问一下,怎么贴代码的哈;)
能力值:
( LV4,RANK:50 )
15 楼
使用:
[ CODE]
代码写在这里
[ /CODE]
能力值:
(RANK:170 )
16 楼
我这不可以用sum,有个库里面有sum,
刚才我没测试,用了if(*str>='0' && *str<='9')判断,并把数字后跳得过程后移则没有"--"的问题了
哈哈,我学会贴代码了,谢...........
int mysum(const char *str)
{
int s=0;
do
{
if(*str>='0' && *str<='9')
{ // 如果是数字则试图计算
printf("sum = %6d\tcurrent string: %s\n",s,str);
s+=atoi(str);
while(*str>='0' && *str<='9')++str; // 该数字串已计算,跳过数字
}
}while(*str++);
return s;
}
能力值:
( LV10,RANK:170 )
17 楼
又学了不少东西啊!
能力值:
( LV12,RANK:1010 )
18 楼
弱弱的问一下:
do
{
s+=atoi(str);
while(*str>='0' && *str<='9') ++str;
}while(*str++);
其中的
while(*str++) 为什么以此字符串作为判断是否结束的条件呢?
当把字符串读完时,是'\0', while ('\0')是啥意思呢,和while (0)不一样的吧?
能力值:
(RANK:170 )
19 楼
你
printf("%.2X",0xff&'\0');
printf("%.2X",0xff&0);
看下就知道了
能力值:
( LV4,RANK:50 )
20 楼
严格地说,'\0'是char的空字符,0是int类型整数的0,二者是不同的.
但实际上几乎所有的计算机都使用ASCII编码的字符,所以'\0'==(char)0,
而char(0)和(int)0可以安全地隐式转换,所以'\0'==(int)0.
在while中,C++只判断bool类型,而(int)0和false可以约定俗成地隐式转换.
所以最后得到的结论是:'\0'==false.
能力值:
( LV12,RANK:1010 )
21 楼
嗯,谢谢讲解,我明白了
能力值:
( LV12,RANK:1010 )
22 楼
罗嗦一句,楼上的大牛看到了麻烦再分析下啊
:
-----------------------------------------------------------------------
嗯,当指针str移动到 '\0' 时,执行最后一次循环:s+=atoi(str);
然后跳出循环,此时str指向NULL, while(0) 就退出了...
----------------------------
那这个解释好象存在问题:
'\0'==false.
其实'\0' 还是一个字符串,和0不同,只是str指针再挪一位时为NULL了才退出的.
能力值:
( LV4,RANK:50 )
23 楼
'\0' != "\0"
能力值:
( LV12,RANK:650 )
24 楼
atoi()不是ANSI标准,要尽量避免使用,比方说在GCC里就是编译不过的。想要转化的话也可以用sscanf()。
写个不用库函数的:
int calc(char *buf) {
int i, s, ans;
for (i = s = ans = 0 ; buf[i] ; i++) {
if (buf[i] >= '0' && buf[i] <= '9')
s = s * 10 + buf[i] - '0';
else {ans += s; s = 0;}
}
return ans + s;
}
能力值:
( LV4,RANK:50 )
25 楼
这样的话,S只能是数字了