PDA

View Full Version : بدست آوردن یک عدد خاص از رشته Integer



persia_hrn
شنبه 26 مرداد 1392, 02:27 صبح
سلام بر دوستان

همونطور که همه میدونن با دستور زیر میشه از یک رشته String یک کاراکتر رو بدست آورد .


var A, B: String;

...
begin
A:='Salam';
B:=Copy(A,5,1);
که B مساوی میشه با حرف 'm'

میخواستم ببینم چنین کاری رو میشه با یک Integer انجام داد ؟ :متفکر:

و همچنین کسی میدونه Length یک Integer رو چطور میشه مشخص کرد ؟ :متفکر:

hossein_h62
شنبه 26 مرداد 1392, 07:12 صبح
سلام
عددتون رو تبدیل به رشته کنید و ...

یوسف زالی
شنبه 26 مرداد 1392, 09:50 صبح
در حالت کلی بدست آوردن طول یک عدد یعنی تعداد ارقام اون با استفاده از لگاریتم هست. ولی راه ساده تر و البته غیر ریاضی اون همین تبدیل به رشته هست.
برای بدست آوردن رقم n ام یک عدد هم با یک ضرب و تقسیم ساده انجام شدنیه.
مثلا:
X = 12345
n = 3
r = X div 10^(n-1) mod 10

persia_hrn
شنبه 26 مرداد 1392, 11:58 صبح
آقا یوسف خیلی آقایی ممنون

امکانش هست راه به دست آوردن تعداد ارقام هم بهم یاد بدید ؟ :تشویق:
آخه من اصلاً از لوگاریتم چیزی سر در نمیارم :خجالت:

اول باید عذرخواهی کنم واسه اسم تاپیکم که نوشتم Integer و باید مینوشتم Extended .

آقا یوسف من دارم یه تابع مینویسم که چهار عمل اصلی رو روی اعداد تا چهارهزارو خورده ای رقم انجام و اون اعداد رو به صورت اصلیشون نشون بده نه به صورت علمی (مثلاً 1.1E18 رو 100000000000000000 نشون بده ) و از متغیر Extended استفاده میکنم که DIV و Mod رو نمیشه واسه Extended استفاده کرد ، آیا راه دیگه ای هم هست ؟

البته جمع و تفریق و ضربش رو درست کردم و مشکلم توی تقسیمه .

ممنون

یوسف زالی
شنبه 26 مرداد 1392, 13:27 عصر
div و mod به راحتی شبیه سازی می شند.
به هر حال:
شما رو ارجاع می دم به دلفی و ریاضی. اونجا مطلب رو می گذارم

http://barnamenevis.org/showthread.php?388044-%D8%AF%D9%84%D9%81%DB%8C-%D9%88-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C&p=1851442&viewfull=1#post1851442

persia_hrn
شنبه 26 مرداد 1392, 14:25 عصر
آقا یوسف از همکاریتون ممنون ولی همچنان با اعداد بیشتر از 18 رقم مشکل دارم من :گریه:

من آخر بخاطر این علامت علمی اعداد (E) خودمو میکشم :شیطان:

یوسف زالی
شنبه 26 مرداد 1392, 14:35 عصر
یعنی اون کد نمی تونه تعداد ارقام رو بده؟
اگر نه، دقیقا مشکل شما چیه؟
فقط نمایش؟
برای اون که گفتم خودتون یک IntToStr بنویسید و تمام محاسباتتون رو در قالب همون عدد انجام بدید.
مشکل چیه الان؟

Mask
شنبه 26 مرداد 1392, 16:02 عصر
آخه integer که 18 رقم رو نمیتونه ساپورت کنه.

persia_hrn
شنبه 26 مرداد 1392, 20:14 عصر
سلام آقایون

با این تغییرات تا 19 رقم رسید ولی در کل باید یه راهی واسه اعداد بزرگتر باشه یا نه ؟


function NEWFloor(X: Extended): Int64;
begin
Result := Int64(Trunc(X));
if Frac(X) < 0 then
Dec(Result);
end;

function GetDigitCount(N: Extended; Base: word = 10): word;
begin
Result := NEWFloor( Ln(N) / Ln(Base) ) +1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := FloatToStr(GetDigitCount(1000000000000000000));
end;
Error میده وقتی تعداد بیشتر از 19 میشه .
چیزیم که از Errorش فهمیدم اینه که فضای بیشتر از 64 بیت احتیاجه ! :متعجب:

اینم کمک دلفی واسه این Error :

You have specified an integer constant that requires more than 64 bits to represent.
program Produce;
const
VeryBigHex = $80000000000000001;
begin
end.
The constant in the above example is too large to represent in 64 bits, thus the compiler will output an error.
program Solve;
const
BigHex = $8000000000000001;
begin
end.
Check the constants that you have specified and ensure that they are representable in 64 bits.

یوسف زالی
شنبه 26 مرداد 1392, 20:49 عصر
یک راه برای پیاده سازی بدون استفاده از رشته استفاده از گسترش مثل Word و DWord هست.
تعریف یک نوع داده از نوع رکورد که درونش مثلا Hi و Lo داره. برای ست و گت هم باید یک تبدیل ضمنی یا یک SHL انجام بدید..
اگر حال و حوصله کلاس نوشتن رو دارید می تونید برای همچین داده هایی کلاس بنویسید و برای راحتی کار ورود و خروج رو از نوع Variant بگیرید که البته کمی کند می شه.
این کارها هم ذوق می خواد و هم حوصله که از ما یکی که گذشته.. ;)

persia_hrn
شنبه 26 مرداد 1392, 20:55 عصر
مهندس یوسف شما کارتون درسته :چشمک:

البته این کار رو با آرایه برای اعداد صحیح تا نزدیک به 5000 رقمی انجام دادم ولی فقط جمع ، ضرب و تفریق و توی تقسیمش مشکل پیدا کردم ، ولی باید برم تو عمقش شاید بشه بلایی سرش آورد .

به هر حال از اینکه منت به سر ما میذارید و کمک میکنید ممنون .

یوسف زالی
شنبه 26 مرداد 1392, 21:45 عصر
خواهش می کنم. منتی نیست.
اگر تقسیم اعشار نداشته باشید می تونید با استفاده از تفریق های متوالی تقسیم رو هم انجام بدید.