سلام
عدد 10^4 به بالا را چجوری میشه نگهداری کرد ؟
تو سی
سلام
عدد 10^4 به بالا را چجوری میشه نگهداری کرد ؟
تو سی
سلام،
فکر می کنم int64__ به دردتون بخوره. ولی آخه شما تو چه محیطی کار می کنین؟ مطمئن نیستم اینی که گفتم استاندارد هست یا نه، ولی اگه درست یادم باشه یکی دو جا اشاراتی دیدم که C99 از این نوع پشتیبانی می کنه. من که تو 2003 ++VC به کار می برم و خوب کار می کنه.
یه آرایه هم میتونید درست کنید که هر عنصر اون یکی از ارقام عدد مورد نظر باشه که این دیگه واسه اعداد خیلی بزرگه ولی تمام اعمال رو باید دستی بنویسید.
به هر حال بالاخره باید آرایه رو هم بازیابی کنیم و عدد به دست اومده رو تو حافظه استفاده کنیم اون موقع باز مشکل تعریف متغیر به اون بزرگی پیش میاد!
اگه عدد شما از نوع عشاری خیلی بزرگ باشه ازdouble استفاده کنی فکر کنم مشکلی نباشه اگه هم int هست از int64
دوستان من با سی برنامه می خوام اون که تو یه صفحه داسی باز میشه
اما این چیزارو امتحان کردم هیچ کدوم فایده نداره اگرم تو آرایه بریزم همون جور که دوستمون گفتن در هنگام بازیابی کارو خراب میکنه در واقع راهش رو پیدا کردم اما نه کاملا
اگر از دبل استفاده شه اعداد کوچیک رو وقتی بخواهیم ازش پرینت اف بگیریم 0 نمایش میده
برای اعداد بزرگ هم اشتباه نمایش میده
اما راه همینه استفاده از دبل و برای رفع مشکل در هنگام پرینت اف هم باید با درصد اف نمایش داده شود که این هم یه مشکل ایجاد می کند عدد به صورت اعشاری نمایش داده می شود و در هنگام انجام عملیات مثلا اگر با عدد 11111111111111111111111 کار می کردیم
حالا به عدد 11111111111111111110700 می رسیم یعنی از عدد ما کاسته شده اما با امتحان هایی که کردم این مربوط میشه به نمایش عدد و عدد در حافظه همچنان 11111111111111111111111 است و از آن اپسیلونی کم نمی شود اما چجوری متغییر را نمایش دهیم؟!
اتفاقا من هم دارم یه پروژه می نویسم که توی اون از اعداد بزرگ متشکل از صفر و یک مثل 0111001111011101 استفاده می کنم من ابتدا این عدد رو به شکل یک رشته میگیرم و سپس با توابعی مثل atol یا strtod اونو تبدیل می کنم ولی 2 تا مشکل دارم اول اینکه در هنگام تبدیل اون صفر اولی لحاظ نمیشه اما از این مشکل که طبیعیه بگذریم موندم این عدد رو تو چه متغیری بریزم و مهمتر اینکه با چه % اون رو پرینت کنم؟
انگار تنها راه همینه که همون طور که گفتم با آرایه کار کنید و نهایتن اونو تو یه دبل بریزین ولی نمایشش ندین و دوباره اونو تو آرایه برگردونین حالا آرایه را چاپ کنین
چون اون متغییر تو حافظه صحیحه
خوب اینطوری اگه بخواییم با عدد مورد نظر کارای محاسباتی بکنیم با مشکل روبرو میشیم؟!
double توانائی ذخیره سازی اعداد بزرگ رو داره ولی تا 17 رقم با معنی رو بیشتر نمیتونه پشتیبانی کنه. یا به عبارتی اگر شما کل ارقامتون عددی غیر صفر باشه 17 تا شو بیشتر نمی تونه براتون نگه داره ولی اگه 16 تا رقم غیر صفر داشته باشید و در انتها تعداد زیادی صفر داشته باشید میتونه واسه تون نگهداری کنه. امیدوارم مفهوم حرفم رو درک کرده باشید اگر اینطور نیست بد نیست به معنی ارقام با معنی در ریاضیات(اگه اشتباه نکنم ریاضیات گسسته) یه نگاهی بندازید.
همونطور که یکی از دوستان هم گفتن ساده ترین روش ذخیره به صورت رشته ای است. و برای نمایش هم باید اعداد را تک تک نمایش بدی و برای عملیات محاسباتی هم باید تابعش رو خودت پیاده سازی کنی.
اما اگر برای ذخیره سازی بخوای در فضای حافظه صرفه جوئی کنی می تونی به صورت BCD ذخیره اش کنی که در اینصورت مقدار حافظه مصرفی نصف حالت قبل است.
یه راه دیگه هم استفاده از Integer های چند گانه هست (پیاده سازی Int64) یا بالاتر برای کامپایلر هائی که پشتیبانی نمی کنن. (که باز هم در حافظه صرفه جوئی بیشتری میشه)
کلا هر سه روش فوق نیاز به یک ADT برای نمایش , خواندن , جمع , تفریق, ضرب,تقسیم و سایر اعمال مورد نیاز روی اون نمونه اعداد دارد
You never know what you can do until you try