如何判断一个字符串里奇数和偶数的数字

beil0eve 2018-08-22 09:04:05
比如一个字符串S:=21,33,03,45,31,04,56,66,86,55
怎么判断这个字符串里有多少奇数 有多少偶数?
...全文
1143 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

const
  S: string = '21,33,03,45,31,04,56,66,86,55';
var
  nStr: string;
begin
  for nStr in S.Split([',']) do
  try
    if nStr.ToInteger and 1 = 1 then
      ShowMessage('奇数')
    else
      ShowMessage('偶数');
  except
    ShowMessage('不是有效数字');
  end;
end;
  • 打赏
  • 举报
回复
if xx and 1 = 1 then {奇数} else {偶数}
chushouTV 2018-11-06
  • 打赏
  • 举报
回复
求余 0是偶数 1是奇数
  • 打赏
  • 举报
回复
0是偶数...
doloopcn 2018-10-17
  • 打赏
  • 举报
回复
procedure OddEvenNumCounter(S:String;var OddNumCount:Integer;var EvenNumCount:Integer;var ZeroNumCount:Integer);
var
List: TStringList;
i:Integer;
begin
//0不为奇偶数,在过程外设置初始值,有利于批处理
List := TStringList.Create;
List.DelimitedText := S;
for i:=0 to List.Count-1 do
begin
if StrToInt(List[i])=0 then
INC(ZeroNumCount)
else if StrToInt(List[i]) then
INC(OddNumCount);
end;
EvenNumCount := EvenNumCount + List.Count - OddNumCount - ZeroNumCount;
List.Free;
end;
lyhoo163 2018-08-24
  • 打赏
  • 举报
回复
引用 10 楼 DelphiGuy 的回复:
这样写健壮性不好,如果逗号前后有空格的话...
只是算法不同,当然,使用Stringlist,比较好。当出现分隔符多样时: 这种算法比较实用了。
仅修改一句 if (S[I+1]=',') or (S[I+1]=';') or (S[I+1]=' ') then 即可。
同时,比较规范的操作,应事前对String进行格式化处理。
lyhoo163 2018-08-24
  • 打赏
  • 举报
回复
引用 10 楼 DelphiGuy 的回复:
这样写健壮性不好,如果逗号前后有空格的话...
只是算法不同,当然,使用Stringlist,比较好。当出现分隔符多样时: 这种算法比较实用了。
仅修改一句 if (S[I+1]=',') or (S[I+1]=';') or (S[I+1]=' ') then 即可。
同时,比较规范的操作,应事前对String进行格式化处理。
BlueStorm 2018-08-23
  • 打赏
  • 举报
回复
严格上讲,for I := 1 to Len do的效率会高点,但一般差别很少
BlueStorm 2018-08-23
  • 打赏
  • 举报
回复
for T in List do 和 for I := 1 to Len do的效率基本是一样的, 有没有使用到TStringList才是关键。
只在有海量的数据需要判断奇偶数个数的情况下,这两个程序的才会有区别。如果只是判断'21,33,03,45,31,04,56,66,86,55', 假定一个用了1毫秒,另一个用了0.1毫秒,对你有区别吗
秋天之落叶 2018-08-23
  • 打赏
  • 举报
回复
引用 4 楼 BlueStorm 的回复:
//也可以不使用TStringList,下面的写法运行效率更高一点:

我刚仿着把我的控件遍历修改完,你又说这个效率高,哈哈
那么问题来了:for T in List do 和 for I := 1 to Len do 到底哪一个效率更高呢?
BlueStorm 2018-08-23
  • 打赏
  • 举报
回复

//也可以不使用TStringList,下面的写法运行效率更高一点:
procedure TForm1.Button1Click(Sender: TObject);
var
C: AnsiChar;
S: AnsiString;
Found: Boolean;
I, Len, Odd, Even: Integer;
begin
S := '21,33,03,45,31,04,56,66,86,55';
Found := False; Odd := 0; Even := 0; len := Length(S);
for I := 1 to Len do
begin
if S[I] in ['0'..'9'] then
begin
C := S[I];
Found := True;
end;
if Found and ((I = Len) or (not (S[I] in ['0'..'9']))) then
begin
if (C in ['1', '3', '5', '7', '9']) then
Inc(Odd)
else
Inc(Even);
Found := False;
end;
end;
ShowMessage(Format('奇数个数: %d, 偶数个数:%d', [Odd, Even]));
end;
  • 打赏
  • 举报
回复
D7以来语言增强了很多,一些老鸟由于惯性反而不熟悉了
秋天之落叶 2018-08-23
  • 打赏
  • 举报
回复
以前我竟然不会使用for T in List do,哈哈哈
  • 打赏
  • 举报
回复
这样写健壮性不好,如果逗号前后有空格的话...
lyhoo163 2018-08-23
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
S: AnsiString;
i,Len, Odd, Even: Integer;
begin
S := '21,33,03,45,31,04,56,66,86,55';
Odd := 0; Even := 0; len := Length(S);
for I := 1 to Len do
begin
if i<Len then
begin
if S[I+1]=',' then
begin
if S[I] in ['1', '3', '5', '7', '9']
then Inc(Odd)
else Inc(Even);
end
end
else begin
if S[I] in ['1', '3', '5', '7', '9']
then Inc(Odd)
else Inc(Even);
end;
end;
ShowMessage(Format('奇数个数: %d, 偶数个数:%d', [Odd, Even]));
end;

也可这样。方式多种。
  • 打赏
  • 举报
回复
可以:

uses System.SysUtils, System.StrUtils;

procedure StatNumbers(const S: string; var Odds, Evens: integer);
var
p1, p2, n, c: integer;
begin
Odds := 0;
Evens := 0;
p1 := 1;
p2 := 1;
repeat
if p1 > Length(S) then break;
p2 := PosEx(',', S, p2);
if p2 = 0 then p2 := Length(S) + 1;
Val(Copy(S, p1, p2 - p1).Trim, n, c);
if c = 0 then
if n and 1 <> 0 then Inc(Odds) else Inc(Evens);
p1 := p2 + 1;
p2 := p1;
until false;
end;

BlueStorm 2018-08-22
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
var
S, T: String;
Odd, Even: Integer;
List: TStringList;
begin
List := TStringList.Create;
S := '21,33,03,45,31,04,56,66,86,55';
List.DelimitedText := S;
Odd := 0; Even := 0;
for T in List do
begin
if (StrToInt(T) mod 2) = 1 then
Inc(Odd)
else
Inc(Even);
end;
List.Free;
ShowMessage(Format('奇数个数: %d, 偶数个数:%d', [Odd, Even]));
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧