تعداد ارقام یک عدد بزرگ

salome

عضو جدید
سلام
من یک برنامه به زبان java object oriented نوشتم ولی کامپایلر ی که باید accept کنه داور acm است . مشکل من این جا است :برنامه من درسته !!! ولی acm خطای rang answer میده .این برنامه محاسبه تعداد رقم های فاکتوریل عددیه که کاربر وارد میکنه داخل سوال نوشته عدد باید بین 1و 10 به توان 7 باشه ولی همون جوری که دوستان میدونن نهایت یک عدد بزرگ میتونه از نوع longباشه که اونم نمیتونه فاکتوریل عددی مثل 10 به توان 7 رو حساب کنن .اگه کسی راه حلی داره ممنون میشم اگه بهم بگین .
 

!...

عضو جدید
کاربر ممتاز
سلام دوست عزیز!
بله همیجوره!
شما باید با رشته ها کار کنین!
و یه رشته رو رقم رقم , تبدیل به عدد کنین! و محاسبه کنین!
یا حق!
 

shahab85

عضو جدید
سلام سوالی که شما دارید می پرسید اگه اشتباه نکنم سوال مسابقه اینترنتی دو سال پیش در دانشگاه شریف بود.
راه حل خیلی سادس.
شما باید خودتون یه تابع برای محاسبه فاکتوریل بنویسید و برای اینکار باید از کلاس آماده ای در جاوا به اسم Big Integer استفاده کنید.
پیاده سازی این متد به این شکل هست :
کد:
    import java.math.BigInteger;
    public String fact(int n){
        BigInteger result = new BigInteger("1");
        for (int i = 1; i <= n; i++) {
            result = result.multiply(new BigInteger(String.valueOf(i)));
        }
    return result.toString();
    }
با این تابع میتونید فاکتوریل اعداد خیلی بزرگ رو هم حساب کنید.
شمردن ارقام هم که دیگه کاری نداره از مقدار string بازگشتی این تابع استفاده کنید و اونو به یک تابع دیگه بدید تا بشه راحت رقم خاصی رو توش شمرد.
اگه اشتباه نکنم بزرگترین تست کیس اون مسابقه هم 365 فاکتوریل و شمردن ارقام صفر توی اون بود
اگه متوجه نشدید بگید کامل توضیح بدم.
موفق باشید.
 
آخرین ویرایش:

shahab85

عضو جدید
نمیدونم چرا کدی که مینویسم اینجا enter ها رو نشون نمیده :surprised::cry:
گویا درست شد !!!!!!!!!!!!!!!!!!
منتظر بود من یه پست بزنم
 

salome

عضو جدید
"شمردن ارقام هم که دیگه کاری نداره از مقدار string بازگشتی این تابع استفاده کنید و اونو به یک تابع دیگه بدید تا بشه راحت رقم خاصی رو توش شمرد."
ممنونم ولی من درست متوجه نشدم یعنی برای شمردن ارقام باید تابع بنویسم ؟چون من این برنامه رو نوشتم درست هم بوده مشکل اعداد بزرگ بود .
 

shahab85

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

salome

عضو جدید
خروجی این کد اگه درست فهمیده باشم یه string است و من نمیدونم چه طوری از اون برای شمردن تعداد ارقام استفاده کنم.
 

shahab85

عضو جدید
یه خرده واضح توضیح بدید...
یعنی میخواد ارقام اون عدد رو جمع کنید؟
مثلا اگه رشتتون باشه 416 میخواید عدد 11 رو نشون بده؟
خب این که کاری نداره....یه متغیر مثل res با مقداردهی اولیه صفر در نظر بگیرید.
یه حلقه for به طول رشته بزارید کاراکتر به کاراکتر برید جلو هر دفعه هر کاراکتر رو با res جمع کنید...کدشو بنویسم یا متوجه شدید؟
 

salome

عضو جدید
نباید ارقام رو جمع کنه مثلا اگه کاربر ورودی 5رو وارد کنه برنامه باید خروجی 3رو بیرون بده یعنی تعداد ارقام فاکتوریل 5 که میشه 5*4*3*2*1=120 که 120 یک عدد 3رقمیه .حالا با این توصیف و چیزایی که قبلا گفتم چی کار باید بکنم ؟؟؟؟؟:cry:
 

shahab85

عضو جدید
اون متد جواب فاکتوریل رو به صورت یک String بهتون میده طول اون رشته میشه جوابتون دیگه
کد:
int len = fact(n).length()
 
آخرین ویرایش توسط مدیر:
بالا