سلام
من برنامه ای دارم که باید اعداد بزرگتر از مقدار longint رو بتونه محاسبه و جواب بده .ولی هر چی کتاب برنامه نویسی را نگاه کردم چیزی در این مورد پیدا نکردم
چجوری می تونم اعداد بزرگتر را تو برنامه بزارم؟
سلام
من برنامه ای دارم که باید اعداد بزرگتر از مقدار longint رو بتونه محاسبه و جواب بده .ولی هر چی کتاب برنامه نویسی را نگاه کردم چیزی در این مورد پیدا نکردم
چجوری می تونم اعداد بزرگتر را تو برنامه بزارم؟
سلام دوست عزیز،
مشکلت با آرایه حل نمیشه؟ میتونی تابع جمع، ضرب، تفریق و... برای آرایت تعریف کنی و باهاشون کار کنی.
میشه بیشتر راهنمایی کنید( من مبتدی ام)
مثلا اگر برنامه من 2104317849 رو تو یک عدد مثلا 14 ضرب کند عددش تو مقدار longint جا نمیشه؟
چجوری چنین جوابی رو درست چاپ کنم
از آرایه بلدی استفاده کنی؟
بیخیال longint! از اول با آرایه شروع کن.
مثلا:
یه آرایه که تو هر خونه اش یه رقمه(مثلا 50 خونه ای، یه عدد 50 رقمی). فهمیدی؟ بعد میام تابع جمع براش مینویسیم:
از رقم آخر(یکان) شروع میکنیم جمع یا یکان دیگری، اگر از 9 بزگرتر بود رقمی بعدی رو +1 میکنیم.
تا اینجا فهمیدی؟
از نوع داده Int64 استفاده کنید که محدوده -2 به توان 63 تا 2 به توان 63 - 1 را پشتیبانی میکنه. برای اطلاعات بیشتر، به Help دلفی مراجعه کنید.من برنامه ای دارم که باید اعداد بزرگتر از مقدار longint رو بتونه محاسبه و جواب بده .ولی هر چی کتاب برنامه نویسی را نگاه کردم چیزی در این مورد پیدا نکردم
اگر میخوای با اعداد بیشتر از 64 بیت کار کنی ، باید یکی از این کارها رو بکنی :
1- اون تایپ رو خودت پیاده سازی کنی . یک روشش همون آرایه هست که دوستمون گفت .
2- از تایپ های متن باز منتشر شده توی اینترنت استفاده کنی . مثل DFFLib ، WinNTL و ... .
اگر سرعت محاسبه برات مهمه من پیشنهاد میکنم راه دوم یا همون کتابخانه های متن باز آماده رو انتخاب کنی . اما اگر چند تا محاسبه جمع و تفریق ساده است که سرعتش هم خیلی مهم نیست ، با همون آرایه کارت راه میفته .
دوستان من باید از خود زیان پاسکال استفاده کنم نه دلفی.
من رو حالت استاندارد می خوام .
این ارایه ها رو خوندم ولی مثال ها و توضیح هایی که داده بود همش در این مورد بود که توی هر خونه مقدار گذاری شه و همه را با هم چاپ کنه ولی در مورد این حالت که من نیاز دارد که ارایه خودش یک عدد بزرگ رو اول دربافت کنه بعد تو معادله بزاره و جواب رو دوباره ذخیره کنه پیدا نکردم
میشه یکی راهنمایی کنه چجوری میشه اینکارو کرد.(با مثال بگید احتمالا بهتر می فهمم)
آره.
چه خوب منم با پاسکال از این کارا زیاد کردم.
ببین تو توی هر خونه از آرایه میتونی یه عدد داشته باشی، ما این آرایه رو 100 تایی تعریف میکنیم تا 100 تا خونه داشته باشیم.
بعد تو هر خونه تنها یه رقم میریزیم، یعنی خونه 100 آرایه یکان ما میشه و خونه دوم دهگان و...
(البته راه استاندارد و اصولی استفاده از رشته هاست که پدرت درمیاد!)
حالا این عدد صد (سد درسته، فرهنگستان ادب و زبان فارسی ...) رقمی رو با 9 که عددیست یه رقمی جمع میکنیم، مسلما نمیشه ولی ما تابعی مینویسیم که این رو با یکان جمع کنه، اگه یکان از 9 بیشتر شد منهای 10 میکندش و یکی به دهگان اضافه میکنه، حالا میتونیم تابعمون رو پیشرفته کنیم و جمع 100 رقمی با 100 رقمی رو که آسون هم هست بنویسیم.
فهمیدی؟ اگه نه بگو ساده تر بگم، درضمن کد هم میزارم از دفعه بعد الان کار دارم ببخشید.
باید کد بزارید تا بفهمم .
الان فهمیدم که از لحاظ برنامه تو جمع باید یکانم رو ارایه 100 بزنم( در ارایه 100 خونه ای ) و جواب اگر ارایه بزرگتر از 9 شد یکانش رو تو خود ارایه( به کمک تقسیم بر 10 )می زارم و یک واحد به ارایه 99 اضافه می کنم بعد دهگان رو و همینجور به ترتیب...
ولی تو ضرب اگر بخواهیم مثلا عدد 46 را از ورودی گرفتیم و به ترتیب تو ارایه گذاشتیم چجوری در 36 ضرب کنیم رقم اول جوابش میشه216 و دومین رقم جوابش میشه 144 که چون دهگان است 1440 چجوری این جواب هارو در ارایه بزاریم؟
ضرب رو ولش کن!
فعلا جمع رو بنویسیم. آره، ما اول یه آرایه تعریف میکینم(اینا کلیت کاره و کد برنامه رو بعدا که یاد گرفتیم بزار تا درستش کنیم، اگه همنجوری که میخوام بریم راحت تبدیلش میکنیم و در تبدیل کردن مشکل نداره):
a :array[1..100] of integer;
ما قرارداد میکنیم تو هرخونه با توجه به اینکه integer هست یه رقم بیشتر نریزیم تا کارمان راحت شه. حالا این آرایه رو که به نظرمون یه عدد سد رقمی توش جا میشه باید پر کنیم، برای این کار سد تا خونه رو از کاربر میگیریم(میدونی چه جوری که؟)
حالا ما یه آرایه 100 تایی داریم که طبق کار خود کاربر رقم اولی که زده رقم اول است، و رقم آخری که زده رقم سدم.
نکته: کاربر برای پر کردن برای هر خونه یه عدد یه رقمی میزنه. یعنی هرخونه یه رقم از عدد سد رقمیه مائه، مثلا یکان.
*حالا ما جدولی فرضی میکشیم که خونه اول آن جدول 1*100 (یک اوله، یعنی عرضه) سمت چپ باشد و رقم راستِ راست میشه رقم سدم که یکان هست و از نظر ریاضی هم جلوئه
نکته قسمت ستاره دار:این یه توزیح چرت بود! فارسیش میشه اینکه رقم سدم رو میگیریم یکان و رقم 99 رو دهگان و..، یعنی برعکس عدد اندیس.
حالا ما یه عدد سد رقمی داریم که هر رقم آن در یکی از خانه های آرایه ذخیره شده.یعنی یه عدد داریم که ذخیره آن در توان int64 هم نیست چه برسنه به longint! خب، حالا باید با این عدد کار کنیم ...
به همین رویه ما یه عدد سد رقمی دیگه درست میکنیم تا این دو عدد رو با هم جمع کنیم و در یک آرایه 101 رقمی ذخیره کنیم.
حالا ما دو تا آرایه داریم با 100 خانه یا سد رقم از هر کدوم از عدد هامون.
برای جمع اینا به یک تابع (function) احتیاج داریم:
چون تعریف تابع اینجوری که ورودی و خروجی آن آرایه باشه سخته و استفاده از var در تابع کار خوبی نیست و... ما یه procedure درست میکنیم و آرایه هامون رو جهانی (global) تعریف میکنیم تا در این procedure آنها رو تغییر بدیم)
توضیحات: aو b دو آرایه سد تایی ما هستند و k متغییر 101 رقمیست که جواب را در آن میریزیم.
procedure sum;
var
i,j : integer;
begin
for i := 100 downto 1 do
begin
k[i+1]:= a[i] + b[i];
if (k[i+1] > 9) and (i<>1) then
begin
k[i+1]:=k[i+1]-10;
k[i]:= k[i]+1;
end;
end;
if k[2]> 9 then
k[1]:=1
else
for i:=1 to 100 do
k[i]:=k[i+1];
end;
برنامه رو در نوت پد کپی بگیر درست میشه(اگه نشد بگو فایلشو آپلود کنم برات)
یه دور برنامه رو بخون اگه نفهمیدی بگو توضیحش میدم برات.
یه نکته برای اندیس k و فرقش با بقیه: چون k ، 101 رقمیه و اون دو تا 100 رقمی و یکان آنها در اندیس 100 موجود است ولی یکان k باید در اندیس 101 باشد، چون ممکنه 101 رقمی شه، اگه 101 رقمی نشه آخر تابع(البته تابع نمیشه ترجمه procedure) همه ارقام رو یه دونه شیفت میده(جابجا میکنه، طوری که رقم یکان بیاد خونه 100 و رقم دهگان بره خونه 99)
نکته پایانی: اینارو بفهمی حله همه چی، تابع ضرب مثلا برای ضرب در 5 میشه 5 بار آرایه رو با خودش جمع کنیم. برای اینکار هم میشه تابع ضرب نوشت(اصولیش اینه) که البته نوشتن تابع ضرب دیگه مثل آب خودنه.
باز هم درخدمتم
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)