600851475143 এর জন্য "পূর্ণসংখ্যার সংখ্যা খুব বড়" ত্রুটি বার্তা


89
public class Three {
    public static void main(String[] args) {
        Three obj = new Three();
        obj.function(600851475143);
    }

    private Long function(long  i) {
        Stack<Long> stack = new Stack<Long>();

        for (long j = 2; j <= i; j++) {
            if (i % j == 0) {
                stack.push(j);
            }
        }
        return stack.pop();
    }
}

উপরের কোডটি চালিত হলে এটি লাইনে একটি ত্রুটি তৈরি করে obj.function(600851475143);। কেন?


4
এছাড়াও "এল" এবং "এল" এর মধ্যে কোনও পার্থক্য নেই?
ব্যবহারকারী 446654

@ ব্যবহারকারী 446654: না, আছে। পরেরটি আরও পঠনযোগ্য। এর জন্য "জাভা পাজলার" পড়ুন।
আদিল আনসারী

@ ইউজার 446654: সম্ভাব্য মেমরির সীমা ছাড়িয়ে যাওয়ার সম্পর্কে তিলো চিন্তাগুলি আমি আমার 2 টি কয়েন যুক্ত করতে চাই: আপনি যদি একটি উদাহরণের মতো এত বড় সংখ্যার সাথে কাজ করতে চান তবে কোনও সংখ্যার সমস্ত বিভাজক অনুসন্ধান করার জন্য আপনি সত্যই বাজে অ্যালগরিদম বেছে নিয়েছেন। ডায়নামিক প্রোগ্রামিংয়ের উপর ভিত্তি করে কিছু সম্ভবত আরও ভাল কাজ করবে। আরও ফলাফলের জন্য এটিতে গুগল।
রোমান

4
PE ট্যাগ যুক্ত করা হয়েছে, প্রকল্পের এলার # 3
st0le

@ st0le: আইএমএইচও প্রশ্নটি মূল সমস্যা সমাধান সম্পর্কে সঠিকভাবে নয়, এবং আমরা যা দেখি তাও সমাধান নয়।
রোমান

উত্তর:


201

60085147514332-বিট পূর্ণসংখ্যা (টাইপ int) হিসাবে উপস্থাপন করা যায় না । এটি একটি 64-বিট পূর্ণসংখ্যার (প্রকার long) হিসাবে উপস্থাপিত হতে পারে । জাভাতে দীর্ঘ অক্ষরগুলি একটি "এল" দিয়ে শেষ হয়:600851475143L


71

পরিশেষে প্রত্যয় L: 23423429L

ডিফল্টরূপে, জাভা সমস্ত সংখ্যার অক্ষরকে 32-বিট পূর্ণসংখ্যার মান হিসাবে ব্যাখ্যা করে। আপনি যদি স্পষ্টভাবে উল্লেখ করতে চান যে এটি বড় কিছু তবে 32-বিট পূর্ণসংখ্যার Lদীর্ঘতর মানগুলির জন্য আপনার প্রত্যয় ব্যবহার করা উচিত ।


আপনি ভেরিয়েবলের ধরণটি পরিবর্তিত করার পরেও কেন আপনি এই ত্রুটি বার্তাটি পান তার আরও বিশদ বিশদ অনুসন্ধানের জন্য long, এটি পড়ুন: stackoverflow.com/a/8924925/293280
জোশুয়া পিন্টার

29

আপনাকে একটি দীর্ঘ আক্ষরিক ব্যবহার করতে হবে:

obj.function(600851475143l);  // note the "l" at the end

তবে আমি আশা করব যে সেই ফাংশনটি স্মৃতি থেকে (বা সময়) শেষ হয়ে যাবে ...


17
এটি lউচ্চতর ক্ষেত্রে তৈরি করা একটি ভাল অনুশীলন হিসাবে বিবেচনা করা হয় , যাতে এটি থেকে সহজেই পার্থক্যযোগ্য1
Bozho

4
@ বোজো: একমত তবে আমার পার্ল ব্যাকগ্রাউন্ড আছে। আমি "কেবল লেখার জন্য" কোড করি :-)
থিলো

"এল" এর পরিবর্তে "এল" ব্যবহার করুন
কেভিন ভি

13

জাভা সংকলক ডিফল্টরূপে ধরণের ধরণের ধ্রুবক মান হিসাবে 600851475143 ব্যাখ্যার চেষ্টা করে। এটি একটি ত্রুটির কারণ 600851475143 কোনও ইন্টের সাথে প্রতিনিধিত্ব করা যায় না।

সংকলকটি বলতে যে আপনি সংখ্যাকে ইন্টারপ্রেট করতে চান দীর্ঘ হিসাবে আপনি lবা Lএটির পরে যোগ করতে হবে। আপনার নম্বরটি এর পরে দেখতে হবে600851475143L

যেহেতু কিছু ফন্ট একে অপরের থেকে "1" এবং লোয়ার কেস "এল" পার্থক্য করা শক্ত করে তোলে আপনার সর্বদা উপরের কেস "এল" ব্যবহার করা উচিত।


6

আপনি 40 বিট প্রয়োজন আক্ষরিক 600851475143. জাভা পূর্ণসংখ্যা প্রতিনিধিত্ব করতে, সর্বোচ্চ পূর্ণসংখ্যা মান 2 ^ 31-1 তবে (অর্থাত পূর্ণসংখ্যার, 32 বিট দেখতে http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html )।

এর সাথে কিছু করার নেই function। পরিবর্তে দীর্ঘ পূর্ণসংখ্যার আক্ষরিক ব্যবহার করার চেষ্টা করুন (অন্যান্য উত্তরে প্রস্তাবিত হিসাবে)।


4

সংকলনের সময় "600851475143" নম্বরটি 32-বিট পূর্ণসংখ্যায় প্রতিনিধিত্ব করা হয়, এই সমস্যাটি থেকে বেরিয়ে আসার জন্য আপনার নম্বরটির পরিবর্তে দীর্ঘ আক্ষরিক চেষ্টা করুন।


3

অন্যান্য সমস্ত উত্তর ছাড়াও, আপনি যা করতে পারেন তা হ'ল:

long l = Long.parseLong("600851475143");

উদাহরণ স্বরূপ :

obj.function(Long.parseLong("600851475143"));

1

অথবা, আপনি যতক্ষণ ইনপুট নম্বর ঘোষণা করতে পারেন এবং তারপরে কোডটি টেঙ্গো করতে দিন: ডি ...

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("Enter a number");
    long n = in.nextLong();

    for (long i = 2; i <= n; i++) {
        while (n % i == 0) {
            System.out.print(", " + i);
            n /= i;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.