哈工大ACM1002的解题过程

A+B+C


Time limit: 3sec. Submitted: 6774
Memory limit: 32M Accepted: 1143
Source : Unknown


For each pair of integers A B and C ( -2^31 <= A, B, C<= 2^31-1 ), Output the result of A+B+C on a single line.

Sample Input
1 2 33 4 3

Sample Output
610

提示 请注意32位机上int的表示范围。

------------------------------------------------------
题目如上,看起来很简单的问题

根据提示,我知道简单的用int是不行的
根据1001的示例,写出的程序如下:

#include <iostream>
using namespace std;
int main()
{
long a,b,c;
while(cin>>a>>b>>c)
{
cout<<a+b+c<<endl;
}

return 0;
}



提交的结果是Wrong Answer。

后发现,long>=int 很多情况下,是取等于

所以,用long是不行的。

干脆改为long double,还是wa(Wrong Answer)
仔细研究了数据类型长度

发现32位机子上
type sizeof
short 2
int 4
long 4
double 8
long double 12
就是说,题目中A,B,C都可以用int表示,只是结果就超过了int的表示范围。
----------------------------
于是,改为

#include <iostream>
using namespace std;
int main()
{
int a,b,c;
double sum;
while(cin>>a>>b>>c)
{
sum=a+b+c;
cout<<sum<<endl;
}

return 0;
}


结果,还是wa
用A=B=C=2^31-1 即2147483647 测试,结果是用科学计数法表示的,为2.14748e+09
经调试,才发现,原来a+b的值为-2,即已经越界了。
-----------------------------------
改为:

#include <iostream>
using namespace std;
int main()
{
int a,b,c;
double sum;
while(cin>>a>>b>>c)
{
sum=(double)a+b+c;
cout<<sum<<endl;
}

return 0;
}

结果,wa
调试,结果是正确的,
那么就是输出结果不符合要求
C++double的默认输出好像是科学计数法的,所以修改为:

include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a,b,c;
double sum;
while(cin>>a>>b>>c)
{
sum=(double)a+b+c;
cout<<fixed<<setprecision(0)<<sum<<endl;
}

return 0;
}


调整fixed输出,找了很久,才发现fixed是对应于scientfic的,英语还是不行
挑战有效位数,使看起来象整数。

提交,accepted。

才算OK。
--------------------------------------------
看起来很简单的东西,很多的细节,还是不会注意到,汗!

Del.icio.us :
Flickr :
Technorati :

- 阅读全文 -

TStrings 参数传递方法

          正常情况下,我们都是习惯于直接把结果当作函数的结果返回
例如:
1)
function
getCommList:TStrings;
var        
   sl:TStrings;
begin
  sl:=TStringList.create;
 
  .....
  result:=sl;            
end;
____________________________

然后调用:
var

  sl2:TStrings;
begin
  sl2:=TStringList.create;  //这里也需要,不然会警告没有初始化
  try
  sl2:=getCommList;
 ...
 finally
  sl2.free;
end;

end;

-------------------------------------------------------------------------
这样,就有问题了,创建了两次的TStringList,却只进行了一次释放
——————————————————————————————
2)
function
getCommList:TStrings;
var        
   sl:TStrings;
begin
  sl:=TStringList.create;

  try
  .....
  result.assign(sl);            
 finally
 sl.free;
end;
end;

____________________________

然后调用:
var

  sl2:TStrings;
begin
  sl2:=TStringList.create;  
  try
  sl2:=getCommList;
 ...
 finally
  sl2.free;
end;
end;
---------------------------------------------------------------------------------
如此,进行了两次分配,两次释放,但是,运行的时候,却报AV错误
原因不清
或许是sl已经释放,assign并未真正的拷贝了数据?
————————————————————————————————
3)推荐的方法
procedure 
getCommList(varsl:TStrings );
begin
 
 //只需进行必要的赋值  
 sl.clear;
  sl.items.......
end;
____________________________

然后调用:
var
  sl2:TStrings;
begin
  sl2:=TStringList.create;  //这里安正常的需要创建
  try
  getCommList(sl2);
 ...
 finally
  sl2.free;
end;
end;
-----------------------------------------------------------------------------------------------------
如此进行,基本上不用考虑对象是深拷贝,浅拷贝的问题
只需进行常规的操作,避免了内存的创建,释放的困扰。
——————————————————————————————————


 



- 阅读全文 -

测试Semagic

Testing Semagic
难得在台湾的microsoft上发现了一些东西
http://www.microsoft.com/taiwan/WindowsXP/windowsmediaplayer/downloads/create.htm
当然包括这个Semagic了
试试先

- 阅读全文 -

传递string到ppLabel

最近一个项目使用ReportBuilder生成报表,有个标题用Label表示,需要从程序中传递到report里,

最先,直接使用 ppLabel编译通过,但是,在第一次生成报表的时候,在这一句代码停留了很长一段时间,导致性能太差。

后来,在report designer里面的calc,看到有label事件,onGetText,知道是赋值给label用的,但是,用了许多方法,都是因为不知道怎么使用calc的代码。曾经想利用report的parameterlist,但还是用不来,只好放弃。

最后,才在Form的inspector看到和calc中看到的一样的事件,原来,可以直接在delphi里面处理这些事件的,直接写pplabel的OnGetText事件,就可以解决了,走了许多的弯路,终于是搞定这问题。

Del.icio.us : ,
Flickr : ,
Technorati : ,

- 阅读全文 -

Testing BlogJet

I have installed an interesting application - BlogJet. It's a cool Windows client for my blog tool (as well as for other tools). Get your copy here: http://blogjet.com

"Computers are incredibly fast, accurate and stupid; humans are incredibly slow, inaccurate and brilliant; together they are powerful beyond imagination." -- Albert Einstein

- 阅读全文 -

delphi 即时刷新hint的方法

在delphi中,使用DBCHART,在鼠标移动的时候,用hint显示鼠标当前位置的信�?/P>

Call application.CancelHint to remove the old hint,

the application.ActivateHint to show the new hint.

消息来至

- 阅读全文 -

cvs for Delphi

一直以来,都是使用vssxion 才对delphi进行source control,但总觉得用的不爽。我一直用的是2.0的版本,因为破解完全,跟注册版一样,看到盒子上有3.1的,甚至5.0的,但都是带着破解伴侣的。呵呵,带个这样的东西,说明破解的功力还是有点差距的。可惜,网上都找不到新版的破解。

一直在寻找cvs的插件,就只有一个sourceXion,可惜网上的只有1的版本,才算是完全破解的,也就不怎么用了

今天下午郁闷了一下,找了个athlant,据说是可以连接各种source provider,下载,安装,看起来都不错,跟vss一样的界面。可是,竟然没有发现cvs的配置选项,只有一个就是vss。上网查看一下,原来是需要一个cvs插件,有两个选择:cvsproxy或者igloo,官方推荐是前者,不过非是免费的,破解版本只有1的,当前最新是1,而后者呢,基本上找不到下载的地方。官方网站,google可以找出来,我却登录不了

郁闷了一个下午!

ps:呵呵,现在基本上不用cvs了

Del.icio.us :
Flickr :
Technorati :

- 阅读全文 -

mysql 安装的几个问题及解决

昨天装的mysql,因为没有时间,几个问题也没有解决。因为原先有安装旧版本的rpm包,只卸载了server包,再,原来的数据及配置仍在,日志如下:
1227 16:42:59 InnoDB: Starting shutdown...
041227 16:43:00 InnoDB: Shutdown completed; log sequence number 0 43634
041227 16:43:00 [Note] /usr/libexec/mysqld: Shutdown complete

041227 16:43:00 mysqld ended

041228 13:30:17 mysqld started
041228 13:30:18 InnoDB: Started; log sequence number 0 43634
041228 13:30:18 [Warning] mysql.user table is not updated to new password format ; Disabling new password usage until mysql_fix_privilege_tables is run
041228 13:30:18 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone _leap_second.frm' (errno: 13)
041228 13:30:18 [Warning] Can't open and lock time zone table: Can't find file: './mysql/time_zone_leap_second.frm' (errno: 13) trying to live without them
/usr/libexec/mysqld: ready for connections.
Version: '4.1.7' socket: '/tmp/mysql.sock' port: 3306 Source distribution
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/help_cate gory.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/help_keyw ord.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/help_rela tion.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/help_topi c.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone .frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone _leap_second.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone _name.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone _transition.frm' (errno: 13)
041228 13:31:30 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone _transition_type.frm' (errno: 13)
041228 13:31:59 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/time_zone .frm' (errno: 13)
多次运行mysql_install_db及mysql_create_system_database都没有解决。今天一气之下,make uninstall了。并且,删除原来的配置文件/etc/my.cnf,以及数据目录/var/lib/mysql/,重新make install。运行了mysql_install_db及mysql_create_system_database之后,出现041228 17:53:31 InnoDB: Started; log sequence number 0 43634
041228 17:53:31 [ERROR] /usr/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)041228 17:53:31 [ERROR] Fatal error: Can't open privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
041228 17:53:31 mysqld ended
的错误,查看数据目录存在表格host.frm,发现属主为root且其他人没有读权限,chown mysql.mysql host.frm后,该错误消除,但出现类似的错误,把该目录全部chown 之后,问题解决。

- 阅读全文 -

apache 安装日记

很难得的我终于开始编译安装apache +mysql+php了。以前总是利用现成的rpm包,可是apache 总是有点问题,就是如果把文档放在home,就总是被拒绝访问。我以为是rpm的配置问题,可惜不知道问题在哪里,所以决定全部重装。
下载了全部的源代码包,本来是在fat32的分区上编译的,因为其中好象apache有一些硬连接不行,看起来vfat的不支持硬连接。只好转到home 下(ext3)。本来不准备编译mysql的,可惜在configure php 的时候,用./configure --with-mysql --with-apxs2=/usr/local/apache2/bin/apxs 时,出现mysql连接错误,网上好多的是在configure的时候就连接apache和php,我用--with-apxs2,所以只好先装上 apache 再编译php。apache 用./configure --with-mysql ,make ,make install ,没有问题,编译也很快。麻烦的是mysql编译用了好长时间。完成之后,用默认的mysql 总是连不上,提示 是socket 路径不对,原来跟原来rpm包的配置不一样。在/etc/my.conf修改了server的socket参数,解决。
接下来编译php,基本上没有什么问题。至此,apache可以正常启动。可惜我的原来的问题还是没有解决。网上看到了好多文章,都说是权限问题,我也知 道是,曾经认真的对比/usr/local/apache/htdocs/和/home/*/public_html的权限,改成完全一样,仍旧没有解决 问题。访问public_html目录下的文件都不行,包括连接过去的。一般的要求目录权限是755。后来,一路查找,发现从/usr到 usr/local/apache/htdocs/,所有目录权限都符合要求,而在home下用户目录的权限却是700,怪不得访问不了。我的系统是 fc1,默认设置如此。修改之后,问题解决。

- 阅读全文 -

热门文章

最新文章

最近回复

  • : procedure TForm1.CallFoo(S: stri...
  • minyoad: 简单添加了一个页面,有空可以试试看http://www.myba...
  • 神月: 能否做成一个页面啊,然后把自己的SSR全部写进去,然后生成订阅地址
  • yo2minyoad: 修改基于googlecode能获取的最新源码,原版的部分功能消失...
  • 萧何: 原版的一些功能没有了。比如隐藏托盘图标
  • linmurs: 你好,能放一个只在原版的基础上加上批量导入功能的修改版吗,习惯了...
  • vinoca: 用mplayer直接dump音频,速度很快的。
  • Medical Billing: What a great resource!
  • federal grants: My partner and I really enjoyed ...
  • personal fitness trainer: Terrific work! This is the type ...

分类

标签

其它