比如一個字串S:=21,33,03,45,31,04,56,66,86,55
怎么判斷這個字串里有多少奇數 有多少偶數?
uj5u.com熱心網友回復:
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;
uj5u.com熱心網友回復:
以前我竟然不會使用for T in List do,哈哈哈uj5u.com熱心網友回復:
D7以來語言增強了很多,一些老鳥由于慣性反而不熟悉了
uj5u.com熱心網友回復:
//也可以不使用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;
uj5u.com熱心網友回復:
我剛仿著把我的控制元件遍歷修改完,你又說這個效率高,哈哈
那么問題來了:for T in List do 和 for I := 1 to Len do 到底哪一個效率更高呢?
uj5u.com熱心網友回復:
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毫秒,對你有區別嗎
uj5u.com熱心網友回復:
嚴格上講,for I := 1 to Len do的效率會高點,但一般差別很少uj5u.com熱心網友回復:
可以:
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;
uj5u.com熱心網友回復:
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;
也可這樣。方式多種。
uj5u.com熱心網友回復:
這樣寫健壯性不好,如果逗號前后有空格的話...uj5u.com熱心網友回復:
只是演算法不同,當然,使用Stringlist,比較好。當出現分隔符多樣時: 這種演算法比較實用了。僅修改一句 if (S[I+1]=',') or (S[I+1]=';') or (S[I+1]=' ') then 即可。
同時,比較規范的操作,應事前對String進行格式化處理。
uj5u.com熱心網友回復:
只是演算法不同,當然,使用Stringlist,比較好。當出現分隔符多樣時: 這種演算法比較實用了。僅修改一句 if (S[I+1]=',') or (S[I+1]=';') or (S[I+1]=' ') then 即可。
同時,比較規范的操作,應事前對String進行格式化處理。
uj5u.com熱心網友回復:
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;
uj5u.com熱心網友回復:
0是偶數...uj5u.com熱心網友回復:
求余 0是偶數 1是奇數uj5u.com熱心網友回復:
if xx and 1 = 1 then{奇數}
else
{偶數}
uj5u.com熱心網友回復:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/35997.html
標籤:語言基礎/算法/系統設計
