একটি পূর্ণসংখ্যা দেওয়া N. N এর চেয়ে ক্ষুদ্রতম পূর্ণসংখ্যা কোনটি তার সংখ্যা হিসাবে কেবল 0 বা 1 থাকে?


15

তাহলে আমি এন আমি পূর্ণসংখ্যা একটি এন চেয়ে ক্ষুদ্রতম পূর্ণসংখ্যা বৃহত্তর যে কোনো ছাড়া অন্য 0 বা 1. উদাহরণস্বরূপ অঙ্ক ধারণ করে না এটি আছে N = 12তারপর উত্তর 100। আমি সি ++ এ একটি বর্বর শক্তি পদ্ধতির কোড করেছি।

int main() {
    long long n;
    cin >> n;

    for (long long i = n + 1; ; i++) {
        long long temp = i;
        bool ok = true;
        while (temp != 0) {
            if ( (temp % 10) != 0 && (temp % 10) != 1) {
                ok = false;
                break;
            }
            temp /= 10;
        }
        if (ok == true) {
            cout << i << endl;
            break;
        }
    }
}

সমস্যাটি হ'ল, আমার পদ্ধতিটি খুব ধীর slow আমি বিশ্বাস করি এটি সমাধানের জন্য খুব দক্ষ পন্থা রয়েছে। আমি কীভাবে এই সমস্যাটি দক্ষতার সাথে সমাধান করতে পারি?


4
ইউনিট দিয়ে শুরু করুন। অঙ্ক প্রতিটি পদের জন্য একটি শূন্য এবং বহন 1. একই পদ্ধতি পুনরাবৃত্তি করুন করা 0 বা 1 ছাড়া অন্য হয়, তাহলে
Sembei Norimaki

1
এটি একটি অনুরূপ সমস্যা বর্ণনা করে। সম্ভবত সাহায্য করে
টমবম্বাডিল

নেতিবাচক Nঅনুমতি আছে? এছাড়াও, এটি আপনার পক্ষে আপনার প্রকারের উপচে পড়া ঝুঁকির কারণ হিসাবে এটি কঠিন। সীমা কি N?
বাথশেবা

1
@ সাবেমি নরিমাকি: এটি ভুল। এটি একচেটিয়াভাবে 0 এবং 1 দিয়ে তৈরি সংখ্যাটি অপরিবর্তিত রেখে দেবে এবং অন্য ব্যর্থতাও রয়েছে।
ইয়ভেস দাউস্ট

1
@ সাবেমি নরিমাকি: আমি বলেছিলাম যে অন্যান্য ব্যর্থতাও রয়েছে। এগুলি রয়ে গেছে, যেমন আপনার পদ্ধতিটি ভুল। 1 থেকে 50 পর্যন্ত পূর্ণসংখ্যার চেষ্টা করুন এবং আপনি ভুলগুলি দেখতে পাবেন। আরে হিউম্যান, ডায়াবেটিকের ক্রমাগত।
ইয়ভেস দাউস্ট

উত্তর:


20
  1. বৃদ্ধি এন,

  2. বাম থেকে শুরু করে, আপনি উপরে একটি অঙ্ক না পাওয়া পর্যন্ত স্ক্যান করুন it. এর আগে আংশিক সংখ্যাটি বাড়ান এবং বাকীটি শূন্য করুন।

যেমন

12 -> 13 -> 1|3 -> 10|0
101 -> 102 -> 10|2 -> 11|0
109 -> 110 -> 110|
111 -> 112 -> 11|2 -> 100|0
198 -> 199 -> 1|99 -> 10|00
1098 -> 1099 -> 10|99 -> 11|00
10203 -> 10204 -> 10|204 -> 11|000
111234 -> 111235 -> 111|235 -> 1000|000
...

প্রমাণ:

অনুরোধ করা নম্বরটি অবশ্যই কমপক্ষে N + 1 হওয়া উচিত, এ কারণেই আমরা বৃদ্ধি করি। আমরা এখন বৃহত্তর বা সমান সংখ্যার সন্ধান করছি।

আসুন প্রিফিক্সটিকে প্রাথমিক 0/1 ডিজিট বলি এবং তার পরে কী হবে প্রত্যয় । আমাদের প্রত্যয়ের প্রথম অঙ্কটি একটি শূন্য দ্বারা প্রতিস্থাপন করতে হবে এবং আরও বড় উপসর্গটি সেট করতে হবে। সবচেয়ে ছোট উপসর্গটি ফিট করে বর্তমান প্রিফিক্স প্লাস ওয়ান। এবং সবচেয়ে ছোট প্রত্যয়টি ফিট হয় সমস্ত শূন্য।


হালনাগাদ:

আমি উল্লেখ করতে ভুলে গেছি যে উপসর্গটি অবশ্যই বাইনারি সংখ্যা হিসাবে বাড়ানো উচিত , অন্যথায় নিষিদ্ধ সংখ্যাগুলি উপস্থিত হতে পারে।


7

আর একটি সম্ভাবনা নিম্নলিখিতটি হতে পারে:

  • আপনি "1111111 ... 1111" প্রকারের ডেটা ব্যবহারের দ্বারা সমর্থিত টাইপের বৃহত্তম দশমিক সংখ্যাটি দিয়ে শুরু করুন

    অ্যালগরিদম ধরে নেয় যে ইনপুটটি এই সংখ্যার চেয়ে ছোট; অন্যথায় আপনাকে অন্য ডেটা ধরণের ব্যবহার করতে হবে।

    উদাহরণ: ব্যবহার করার সময় long long, আপনি নম্বরটি দিয়ে শুরু করুন 1111111111111111111

  • তারপরে বাম থেকে ডানে প্রতিটি দশমিক অঙ্ক প্রক্রিয়া করুন:
    • অঙ্কটি 1 থেকে 0 করার চেষ্টা করুন।
    • যদি ফলাফলটি এখনও আপনার ইনপুট থেকে বড় হয় তবে পরিবর্তনটি করুন (অঙ্কটি 0 তে পরিবর্তন করুন)।
    • অন্যথায় অঙ্কটি 1 থেকে যায়।

উদাহরণ

Input = 10103
Start:  111111
Step 1: [1]11111, try [0]11111; 011111 > 10103 => 011111 
Step 2: 0[1]1111, try 0[0]1111; 001111 < 10103 => 011111
Step 3: 01[1]111, try 01[0]111; 010111 > 10103 => 010111
Step 4: 010[1]11, try 010[0]11; 010011 < 10103 => 010111
Step 5: 0101[1]1, try 0101[0]1; 010101 < 10103 => 010111
Step 6: 01011[1], try 01011[0]; 010110 > 10103 => 010110
Result: 010110

সঠিকতার প্রমাণ:

আমরা এই অ্যালগরিদমে ডিজিট দ্বারা ডিজিটার প্রক্রিয়া করি। প্রতিটি পদক্ষেপে এমন ডিজিট রয়েছে যার মান ইতিমধ্যে পরিচিত এবং এমন অঙ্কগুলি রয়েছে যার মানগুলি এখনও জানা নেই।

প্রতিটি পদক্ষেপে, আমরা বামতম অজানা সংখ্যাটি অনুসন্ধান করি।

আমরা সেই অঙ্কটি "0" এবং অন্যান্য সমস্ত অজানা সংখ্যা "1" তে সেট করেছি। যেহেতু তদন্তের জন্য চিহ্নিত সংখ্যাটি অজানা অঙ্কগুলির মধ্যে সর্বাধিক তাৎপর্যপূর্ণ, ফলস্বরূপ সংখ্যাটি সম্ভবত সেই সংখ্যাটি "0" হওয়ার সাথে সর্বাধিক সম্ভাব্য সংখ্যা। যদি এই সংখ্যাটি কম বা ইনপুট সমান হয় তবে প্রোজড ডিজিটটি অবশ্যই "1" হতে হবে।

অন্যদিকে, ফলাফলটি সংখ্যার সম্ভাব্য সংখ্যার চেয়ে কম যেখানে পরীক্ষার সংখ্যাটি "1" হয়। ফলাফলের সংখ্যাটি যদি ইনপুটটির চেয়ে বড় হয় তবে অঙ্কটি অবশ্যই "0" হবে।

এর অর্থ হ'ল আমরা প্রতিটি ধাপে একটি অঙ্ক গণনা করতে পারি।

সি কোড

(সি কোডটিও সি ++ এর অধীনে কাজ করা উচিত):

long long input;
long long result;
long long digit;

... read in input ...

result = 1111111111111111111ll;
digit = 1000000000000000000ll;

while( digit > 0 )
{
    if(result - digit > input)
    {
        result -= digit;
    }
    digit /= 10;
}

... print out output ...

3

আমাকে কয়েকটি বিকল্প প্রস্তাব দিন।

আই। বৃদ্ধি করা। এটি @YvesDaoust পদ্ধতির একটি পরিবর্তন বিবেচনা করুন।

  1. এন দ্বারা বৃদ্ধি 1
  2. শীর্ষস্থানীয় শূন্যের সাথে ফলাফল প্রসারিত করুন
  3. শেষ থেকে দ্বিতীয় অঙ্কে যান
    (ক) যদি এটি 2 এর চেয়ে কম হয় তবে সমস্ত কিছু যেমন
    (বি) তে রেখে দিন অন্যথায় এটি 0 তে সেট করুন এবং পূর্ববর্তী বৃদ্ধি করুন
  4. 3a পদক্ষেপ পুনরাবৃত্তি করুন, খ

উদাহরণ:

1. N = 0 -> 1 -> (0)|(1) -> 1
2. N = 1 -> 2 -> (0)|(2) -> (1)|(0) -> 10
3. N = 101 -> 102 -> (0)|(1)(0)(2) -> (0)|(1)(1)(0) -> (0)|(1)(1)(0) -> (0)|(1)(1)(0) -> 110
4. N = 298 -> 299 -> (0)|(2)(9)(9) -> (0)|(2)(10)(0) -> (0)|(3)(0)(0) -> (1)|(0)(0)(0) -> 1000

দশমিক বিন্যাসে আপনি ফলাফল পাবেন।


২। বিভাজক।

  1. এন দ্বারা বৃদ্ধি 1
  2. যোগফল 0 তে নির্ধারণ করুন
  3. ডিভ (ডি) এবং মোড (এম) অংশ পেতে 10 দ্বারা ফলাফল ভাগ করুন
  4. এম
    (ক) পরীক্ষা করুন যদি এম 1 ছাড়িয়ে যায় তবে ডি
    (বি) বৃদ্ধি করুন অন্যথায় এম * 10 কে দ্বারা যোগ করুন , যেখানে কে বর্তমানের পুনরাবৃত্তি সংখ্যা (0 দিয়ে শুরু হবে)
  5. ডি 0 না হওয়া পর্যন্ত 3,4 পদক্ষেপগুলি পুনরাবৃত্তি করুন

উদাহরণ 1:

1. N = 0 -> N = 1
2. sum = 0
3. 1/10 -> D == 0, M == 1 -> sum = sum + 1*10^0 == 1
4. D == 0 -> sum == 1

উদাহরণ 2:

1. N = 1 -> N = 2
2. sum = 0
3. 2/10 -> D == 0, M == 2 -> D = D + 1 == 1
4. 1/10 -> D == 0, M == 1 -> sum = sum + 1*10^1 == 10
5. D == 0, sum == 10

উদাহরণ 3:

1. N = 101 -> N = 102
2. sum = 0
3. 102/10 -> D == 10, M == 2 -> D = D + 1 == 11
4. 11/10 -> D == 1, M == 1 -> sum = sum + 1*10^1 = 10
5. 1/10 -> D == 0, M == 1 -> sum = sum + 1*10^2 == 10 + 100 == 110
6. D == 0, sum == 110

উদাহরণ 4:

1. N = 298 -> N = 299
2. sum = 0
3. 299/10 -> D == 29, M == 9 -> D = D + 1 == 30
4. 30/10 -> D == 3, M == 0 -> sum = sum + 0*10^1 == 0
5. 3/10 -> D == 0, M == 3 -> D = D + 1
6. 1/10 -> D == 0, M == 1 -> sum = sum + 1*10^3 == 1000
7. D == 0, sum == 1000
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.