注册 登录
编程论坛 C++教室

优化代码

kocd 发布于 2009-07-27 21:23, 743 次点击
要输入一行数字:如12 45 23 56 78 89
但是不知道数字的个数,我的写法:
int a[100],i;char c=' ';
for(i=0;c!='\n';i++)
  {
          cin>>a[i];
          cin.get(c);
  }
但是这样的算法花费时间太多了,有没有更加高效的方法?

要所有的数字,和数字的个数

[[it] 本帖最后由 kocd 于 2009-7-31 18:50 编辑 [/it]]
14 回复
#2
yu5890681yu2009-07-27 21:28
回复 楼主 kocd
楼主的意思是只要求数字的个数吗?
#3
pangding2009-07-27 23:53
回复 楼主 kocd
编译的速度太慢吗?
#4
kocd2009-07-28 18:30
回复 2楼 yu5890681yu
要所有的数字,和数字的个数
#5
kocd2009-07-28 18:31
回复 3楼 pangding
是啊。。求更加高效的方法
#6
ryanzhong2009-07-28 21:06
用NEW动态分配空间,编译的时候会不会快点?
#7
pangding2009-07-29 10:11
回复 5楼 kocd
怎么会编译的速度慢呢…… 一般来说编译器都是大师精心设计的,在各种方面的性能都反复考量过。像这种只有这么两行的程序,一般应该瞬间就编译好了。几千行的代码编译花的时间基本上也没什么感觉。
你用的是不是vc6.0,这个编译器有时候经常出点各种问题,你在编译的时候,是不是它说编译中,然后就卡住了?这不是编译的慢,但具体什么原因我也不是很清楚。你重建一个工程,把文件什么的都拷贝过去,看看是不是就能编译了?
#8
kocd2009-07-29 23:43
回复 7楼 pangding
。。的确是太慢了,我用char a[100];
gets(a);
然后根据空格什么的来区分每个数字都会比这样快。。
一般我用1楼的写法从编译通过到运行程序要至少5秒的时间。。

我用DEV C++
#9
pangding2009-07-30 00:06
回复 8楼 kocd
编译只干词法分析,语法分析,语义分析之类的。然后(可能)会生成汇编码,然后再汇编出机器语言。执行什么的是另外的动作,这之间花的时间,应该不是编译器的工作。

如果你是觉得执行的慢,那就应该换换算法,比如你之后用的算法在执行的时候就会快一些。但我觉得,就你举例用的那几个数,应该看不出什么区别。如果你还是觉得速度太慢的话,换台机子或者换个编译器看看有没什么改善。
#10
hhei2009-07-31 10:44
有些时间是必须用的吧,避免不了的
#11
kocd2009-07-31 18:49
回复 9楼 pangding
。。。我的意思好像就是请大家优化下算法,使速度能更快
当编译器通过到程序执行就是跳出黑色的框框之间的时间花费太多了。。
我举得只是例子。。
我一楼的算法中输入整型和字符型两种,我想应该是编译器在区分整型和字符间会很费力,导致很费时间
如果是你,要求是读入N个数据,N未知,要能知道数据和N,你会怎么写代码?
我想的方法就两种
1。1楼的做法
2.当作字符型全部输入后再根据空格啊,负号,数字之类的分类,这样时间可以加快一倍多,不过麻烦程度要加2,3倍多
#12
kocd2009-07-31 18:53
回复 10楼 hhei
我想这个不是应该花的时间。。这个算法估计是太破了,这个题目你会怎么做?
#13
pangding2009-08-01 18:01
以下是引用kocd在2009-7-31 18:49的发言:

。。。我的意思好像就是请大家优化下算法,使速度能更快
当编译器通过到程序执行就是跳出黑色的框框之间的时间花费太多了。。
我举得只是例子。。
我一楼的算法中输入整型和字符型两种,我想应该是编译器在区分整型和字符间会很费力,导致很费时间
如果是你,要求是读入N个数据,N未知,要能知道数据和N,你会怎么写代码?
我想的方法就两种
1。1楼的做法
2.当作字符型全部输入后再根据空格啊,负号,数字之类的分类,这样时间可以加快一倍多,不过麻烦程度要加2,3倍多

冒黑框慢,跟编译器根本就没什么太大关系。你双击一下 我的电脑 冒白框的速度快不?在windows里初始化一个窗口就要那么多时间,这之间还要加载程序,没什么办法提高速度。还有编译完成之后,还要做很多工作,比如链接什么的。

在编译器眼中,所有源代码都是字符,它只是分析一下你写的这堆字符是什么意思。致于执行,编译器也有一定的优化能力优化你写的代码。你这个代码执行的不快可能是因为函数调用的太多了。

如果我写这个的话,就会像你第二次说的那样,全按字符读出来(读一行),然后再一个一个分析数是多少,有几个。
#14
CrystalFan2009-08-02 03:25
我的优化:
程序代码:

int a[100],i;char c=' ';
for(i=0;;i++)
  {
          if(!(cin>>a[i]))
          {
            i--;
            break;
          }               
  }

则在输入结尾加上一个【Ctrl+Z】就可以了。
如果是读文件,遇到结尾(EOF)就会退出了。
#15
missiyou2009-08-02 21:49
以下是引用hhei在2009-7-31 10:44的发言:

有些时间是必须用的吧,避免不了的




呵,
谁说没有办法的。 其实之所以慢,是因为输入是int 类型吧, 如果把它当成字符型这样就快了,

char *c_p = "12 4 5 679  646 4 "
写一个转换函数, 把字符转换来int类型。
空格处理啊,
就差不多了。
1