ACM

حل سوال مربوط به مسابقه ACM بوعلی سینا(+تابع تفریق اعداد بزرگ)

acm

acm

Problem: arranging digits
Input File : Standard Input
Output : Standard Output

Given a number, we can form a number chain by
۱. arranging its digits in descending order
۲. arranging its digits in ascending order
۳. subtracting the number obtained in (2) from the number obtained (1) to form a new number
۴. and repeat these steps unless the new number has already appeared in the chain
Note that 0 is a permitted digit. The number of distinct numbers in the chain is the length of the chain. You are to write a program that reads numbers and outputs the number chain and the length of that chain for each number read.
Input
The input consists of a sequence of positive numbers, all less than 10^50 , each on its own line, terminated by 0. The input file contains at most 5000 numbers.
Output
The output consists of the number chains generated by the input numbers, followed by their lengths exactly in the format indicated below. After each number chain and chain length, including the last one, there should be a blank line. No chain will contain more than 1000 distinct numbers.
Sample Input
۱۲۳۴۵۶۷۸۹
۱۲۳۴
۴۴۴
۰
Sample Output
Original number was 123456789
۹۸۷۶۵۴۳۲۱ – ۱۲۳۴۵۶۷۸۹ = ۸۶۴۱۹۷۵۳۲
۹۸۷۶۵۴۳۲۱ – ۱۲۳۴۵۶۷۸۹ = ۸۶۴۱۹۷۵۳۲
Chain length 2
Original number was 1234
۴۳۲۱ – ۱۲۳۴ = ۳۰۸۷
۸۷۳۰ – ۰۳۷۸ = ۸۳۵۲
۸۵۳۲ – ۲۳۵۸ = ۶۱۷۴
۷۶۴۱ – ۱۴۶۷ = ۶۱۷۴
Chain length 4
Original number was 444
۴۴۴ – ۴۴۴ = ۰
۰ – ۰ = ۰
Chain length 2

ترجمه این سوال در حالت کلی این می شود :یک عدد از کاربر می گیریم که حداکثر ۵۰ رقم است .عدد را یک بار صعودی می کند و یک بار آن را نزولی می کند و عدد بزرگ را همانی که به صورت نزولی نوشته شده است را منهای عدد کوچک تر می کند بعد عدد جدیدی به دست می آید که باز هم همین کار را با آن می کنیم آنقدر این کار را می کنیم تا دو عدد حاصل از منها کردن در دو مرحله متوالی با هم برابر شوند این کار را می کنیم تا ۱۰۰۰ بار اگر شد تعداد مراحلی را که انجام داده ایم مینویسیم اگر نه که هیچ.
تنها نکته این برنامه نوشتن تابعی برای تفریق کردن ۲ عدد ۵۰ رقمی است.در این جا برای راحتی کار از رشته ای کاراکتری استفاده می کنیم آن هم به طول ۵۰ کاراکتر .تابع sub کار تفریق ۵۰ کاراکتر را انجام می دهد.تابع dec_arr به صورت نزولی عدد را می نویسد.تابع asc_arr عدد را به صورت صعودی می نویسد.تابع compare به دو عدد مقایسه انجام می دهد.

 

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

۷ دیدگاه

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *