برای روشن کردن ترمینال، کلیک کن یا هر کلیدی را بزن

پرش به محتوای اصلی
>_
درس ۱۴متوسط

کار با ارقام عدد: مجموع، معکوس و پالیندروم

تکنیک‌های کلاسیک پردازش ارقام با عملگر‌های % و /

معمولی
حلقه‌ها و کنترل جریان•صفحات ۲۳-۲۴•۲۰ دقیقه•۱٬۵۰۸ کلمهزمان مطالعه: ۰ دقیقه
فهرست این درس
// اهداف۵
  • استخراج ارقام عدد با عملگر‌های % 10 و / 10
  • محاسبه مجموع ارقام و چاپ معکوس ارقام
  • ساخت عدد معکوس و تشخیص عدد پالیندروم (متقارن)
  • شمارش تکرار یک رقم خاص در یک عدد
  • شمارش توان ۲ در تجزیه اولیه عدد

دو عملگر طلایی برای ارقام

برای کار با ارقام یک عدد صحیح، دو عملگر کلاسیک داریم که با هم همه کار‌ها را انجام می‌دهند:

  • n % 10 — باقیمانده تقسیم بر ۱۰، یعنی رقم آخر (یکان) را برمی‌گرداند. مثلاً 457 % 10 = 7.
  • n / 10 — تقسیم صحیح بر ۱۰، یعنی رقم آخر را حذف می‌کند. مثلاً 457 / 10 = 45.

با ترکیب این دو در یک حلقه while (n > 0)، می‌توانیم هر عملیاتی روی ارقام انجام دهیم:

  • مجموع ارقام
  • چاپ معکوس
  • ساخت عدد معکوس
  • تشخیص پالیندروم
  • شمارش تکرار یک رقم
  • شمارش ارقام زوج/فرد

این درس شامل پنج الگوریتم کامل است که هر کدام یک تکنیک پایه را آموزش می‌دهد.

مثال ۱: محاسبه مجموع ارقام

الگوریتم: در هر تکرار، رقم آخر را با n % 10 می‌گیریم، به sum اضافه می‌کنیم و سپس n را با n / 10 یک رقم کوتاه می‌کنیم. این کار را تا رسیدن n به ۰ ادامه می‌دهیم.

مثال: n = 457 → جمع ۴ + ۵ + ۷ = ۱۶.

مجموع تک‌تک ارقام عدد n را محاسبه و چاپ می‌کندcpp
خروجی برنامه
ورودی: 457
خروجی: 7 5 4
sum of digits = 16
در حال باز کردن ویرایشگر…

فلوچارت: مجموع ارقام

flow.svg

مثال ۲: چاپ ارقام به‌صورت معکوس

این الگوریتم بسیار شبیه مجموع ارقام است، اما به جای جمع کردن، فقط هر رقم را با cout چاپ می‌کنیم. به این ترتیب ارقام از انتها به ابتدا نمایش داده می‌شوند.

مثال: n = 12345 → خروجی 5 4 3 2 1.

این فقط چاپ معکوس است، نه ساخت عدد معکوس. برای ساخت عدد معکوس باید فرمول متفاوتی بکار ببریم که در مثال بعد می‌آید.

ارقام عدد را از آخر به اول چاپ می‌کندcpp
خروجی برنامه
ورودی: 12345
خروجی: 54321
در حال باز کردن ویرایشگر…

تفاوت چاپ معکوس و ساخت عدد معکوس

دو الگوریتم متفاوت داریم:

چاپ معکوس: ارقام را یکی یکی از انتها چاپ می‌کنیم.

main.cppcpp

ورودی 457 → خروجی روی صفحه: 754.

ساخت عدد معکوس: یک عدد جدید می‌سازیم که مقدار آن معکوس عدد اصلی است.

main.cppcpp

ورودی 457 → مقدار rev: 754 (یک عدد واقعی).

تفاوت در فرمول rev * 10 + digit است که رقم جدید را به انتهای عدد می‌چسباند. این الگوریتم برای تشخیص پالیندروم لازم است.

مثال ۳: تشخیص عدد پالیندروم (متقارن)

عدد پالیندروم (Palindrome) یا متقارن، عددی است که از چپ به راست و از راست به چپ یکی خوانده شود؛ مثل ۱۲۱، ۱۲۳۲۱، ۴۵۵۴.

الگوریتم: یک کپی از عدد اصلی به نام n2 نگه می‌داریم. سپس با حلقه while، معکوس عدد را در rev می‌سازیم. در پایان اگر rev == n2 بود، عدد پالیندروم است.

نکته مهم: متغیر rev باید قبل از حلقه با ۰ مقداردهی شود، وگرنه مقدار زباله (Garbage Value) خواهد داشت.

بررسی می‌کند آیا عدد با معکوس خود برابر استcpp
خروجی برنامه
ورودی: 12321
خروجی: Yes (palindrome)
در حال باز کردن ویرایشگر…

اصلاح: مقداردهی اولیه rev و n2

در نسخه اصلی جزوه، متغیر‌های Sum (یا rev) و n2 قبل از حلقه while مقداردهی اولیه نشده بودند. این باعث می‌شد Sum مقدار زباله (Garbage Value) داشته باشد و نتیجه کاملاً اشتباه از آب دربیاید. همچنین متغیر n در حلقه تخریب می‌شد و نیاز به کپی n2 = n قبل از حلقه بود.

نسخه اشتباه جزوه
کد دارای باگcpp
نسخه اصلاح‌شده و استاندارد
کد صحیحcpp

فلوچارت: تشخیص پالیندروم

flow.svg

مثال ۴: شمارش تکرار یک رقم خاص

الگوریتم: ارقام n را یکی یکی استخراج می‌کنیم و با b مقایسه می‌کنیم. هر بار که برابر بودند، شمارنده k را یک واحد افزایش می‌دهیم.

مثال: n = 122333, b = 3 → خروجی 3 چون رقم ۳ سه بار آمده.

تعداد دفعاتی که رقم b در عدد n آمده را می‌شماردcpp
خروجی برنامه
ورودی: 122333 3
خروجی: 3
در حال باز کردن ویرایشگر…

تله خطرناک: فراموش کردن n /= 10

اگر در حلقه‌های پردازش ارقام، خط n /= 10 را فراموش کنید، حلقه بی‌نهایت می‌شود. چون n هرگز تغییر نمی‌کند، شرط n > 0 همیشه برقرار می‌ماند و حلقه تا ابد (یا تا زمانی که حافظه پر شود) اجرا می‌شود.

این باگ در نسخه اصلی جزوه هم وجود داشت. همیشه قبل از اجرا بررسی کنید:

  1. آیا در بدنه while چیزی هست که شرط را تغییر دهد؟
  2. آیا این تغییر به سمت false بودن شرط می‌رود؟

اگر هر دو پاسخ «بله» نبود، حتماً باگی وجود دارد.

فلوچارت: شمارش تکرار رقم

flow.svg

مثال ۵: شمارش توان ۲ در تجزیه عدد

هر عدد صحیح را می‌توان به‌صورت ضربی از اعداد اول نوشت. مثلاً 24 = 2³ × 3¹. توان ۲ در تجزیهٔ ۲۴ برابر ۳ است.

الگوریتم: تا وقتی n زوج است (n % 2 == 0)، آن را بر ۲ تقسیم می‌کنیم و شمارنده را یکی افزایش می‌دهیم. تعداد تقسیم‌ها برابر توان ۲ در تجزیه است.

مثال: 24 → 12 → 6 → 3 (سه بار تقسیم بر ۲ شد، تا رسیدن به عدد فرد ۳). پس توان ۲ در تجزیه ۲۴ برابر ۳.

تعداد دفعاتی که عدد بر ۲ بخش‌پذیر است را می‌شماردcpp
خروجی برنامه
ورودی: 24
خروجی: power of 2 = 3
در حال باز کردن ویرایشگر…

چرا توان ۲ مهم است؟

شمارش توان ۲ در تجزیهٔ عدد در چند زمینه مهم است:

  • رمزنگاری: در الگوریتم‌هایی مثل Miller-Rabin برای تشخیص عدد اول.
  • نظریه اعداد: توابع موبیوس و توابع ضربی.
  • پردازش بیتی: تشخیص اینکه آیا عدد دقیقاً توان ۲ است (یعنی در تجزیه‌اش فقط عامل ۲ با توان k ≥ 1 حضور دارد و هیچ عامل اول دیگری ندارد).

ترفند معروف تشخیص توان ۲: عدد n توان ۲ است اگر و فقط اگر n > 0 و (n & (n - 1)) == 0 باشد — مثلاً 8 & 7 برابر 0 می‌شود. دقت کنید پرانتز دور n & (n-1) اجباری است: تقدم == از & بالاتر است و بدون پرانتز، عبارت n & (n-1) == 0 به‌صورت n & ((n-1) == 0) ارزیابی می‌شود — همان تله‌ای که در درس عملگر‌ها دیدیم.

می‌توانید با تعمیم این الگوریتم، توان هر عدد اول دیگر (۳، ۵، ۷، …) را هم بشمارید، کافی است % 2 و /= 2 را تغییر دهید.

مرور سریع مطالب

۱۳ بخش در این درس

تمرین‌ها

01
تمرین•حل کامل دارد

برنامه‌ای بنویسید که عدد n را بگیرد و حاصل‌ضرب ارقام فرد آن را چاپ کند. مثلاً 12345 → 1*3*5 = 15.

نمایش راهنما
در حلقه، اگر رقم فرد بود، آن را در یک متغیر prod (با مقدار اولیه 1) ضرب کنید.
02
تمرین•حل کامل دارد

برنامه‌ای بنویسید که عدد n را بگیرد و چک کند آیا تمام ارقام آن زوج هستند یا نه. مثلاً 2468 → Yes، 2467 → No.

نمایش راهنما
یک متغیر bool allEven با true شروع کنید. اگر یک رقم فرد پیدا شد، آن را false کنید و حلقه را بشکنید.
03
تمرین•حل کامل دارد

برنامه‌ای بنویسید که دو عدد n و k را بگیرد و n را به‌صورت k رقمی (با صفر‌های سمت چپ) چاپ کند. مثلاً n=42, k=5 → 00042.

نمایش راهنما
محتوای n را در یک آرایه یا رشته بریزید. تعداد ارقام n را بشمارید و به اندازه k-count صفر چاپ کنید، سپس n را چاپ کنید.
04
تمرین•حل کامل دارد

برنامه‌ای بنویسید که عدد n را بگیرد و توان هر عدد اول در تجزیه آن را چاپ کند. مثلاً 60 → 2^2 * 3^1 * 5^1.

نمایش راهنما
برای هر عدد اول p (شروع از 2)، تا وقتی n % p == 0 است، شمارش کنید و n را تقسیم کنید. اگر شمارش > 0 بود، چاپ کنید.
// نکات-کلیدی۵
  • 01دو عملگر طلایی برای ارقام: n % 10 رقم آخر را می‌دهد و n / 10 رقم آخر را حذف می‌کند.
  • 02برای ساخت عدد معکوس از فرمول rev = rev * 10 + digit در هر تکرار استفاده کنید.
  • 03عدد پالیندروم عددی است که با معکوس خود برابر است؛ حتماً قبل از تخریب n یک کپی (n2 = n) بگیرید.
  • 04هرگز در حلقه پردازش ارقام، خط n /= 10 را فراموش نکنید؛ وگرنه حلقه بی‌نهایت می‌شود.
  • 05برای شمارش توان p در تجزیه عدد، از حلقه while (n % p == 0) با شمارش و تقسیم استفاده کنید.
گام بعدی پیشنهادی

محاسبات پیشرفته: π، sin، cos و ب.م.م

سری‌های نامتناهی لایبنیتس و تیلور، الگوریتم اقلیدسی و تجزیه اول

۲۵ دقیقهپیشرفته۱۸ بخش

شروع درس

جستجوی سریع در درس‌ها

نام درس، موضوع یا کلمه کلیدی را بنویسید و با Enter به آن بروید