كيف يمكنني حساب الأرقام في عدد صحيح بدون سلسلة من السلسلة؟

StackOverflow https://stackoverflow.com/questions/554521

  •  23-08-2019
  •  | 
  •  

سؤال

أخشى أن هناك إجابة بسيطة وواضحة على هذا السؤال. أحتاج إلى تحديد عدد الأرقام واسعة عدد العناصر، بحيث يمكنني وسادة كل رقم عنصر مع الحد الأدنى عدد الأصفار الرائدة المطلوبة للحفاظ على المحاذاة. على سبيل المثال، لا أريد أي أصفار أفضل إذا كان المجموع أقل من 10، 1 إذا كان ما بين 10 و 99، إلخ.

سيكون أحد الحلول هو إلقاء عدد العناصر على سلسلة ثم عد الأحرف. يوك! هل هناك طريقة أفضل؟

تحرير: لن أفكر في استخدام لوغاريتم الشائعة (لم أكن أعرف مثل هذا الشيء موجودا). لذلك، ليس واضحا - بالنسبة لي - ولكن بالتأكيد بسيط.

هل كانت مفيدة؟

المحلول

هذا يجب أن تفعل ذلك:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;

نصائح أخرى

int length = (int)Math.Log10(Math.Abs(number)) + 1;

قد تحتاج إلى حساب العلامة السلبية ..

سيتم تكرار حل أكثر كفاءة من التقسيم المتكرر إذا كانت البيانات مع الشركات ... على سبيل المثال (حيث n هو الرقم الذي يلزم عدد أرقامه)

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}

إذا كان هناك بعض العلوي العلوي المعقول في عدد العناصر (على سبيل المثال النطاق 32 بت من int غير موقعة)، فإن طريقة أفضل هي المقارنة مع أعضاء بعض الصفاف الثابت، على سبيل المثال

// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;

إذا كنت ستقوم بتسجيل الرقم في .NET، ثم

num.ToString().PadLeft(10, '0') 

قد تفعل ما تريد.

يمكنك استخدام حلقة أثناء الوقت، والتي من المرجح أن تكون أسرع من اللوغاريتم لأن هذا يستخدم الحساب الصحيحة فقط:

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}

أترك الأمر كممارسة لممارسة القارئ لضبط هذه الخوارزمية للتعامل مع الأرقام الصفرية والسالب.

كنت قد نشرت تعليقا لكن درجة مندوب بلدي لن يمنحني هذا التمييز.

كل ما أردت الإشارة إليه هو أنه على الرغم من أن السجل (10) هو محلول أنيق للغاية (اقرأ: سوى عدد قليل جدا من الخطوط التعليمات البرمجية)، فمن المحتمل أن يكون هناك فرض ضرائب على المعالج.

أعتقد أن إجابة Jherico ربما يكون الحل الأكثر كفاءة وبالتالي يجب مكافأته على هذا النحو.

خاصة إذا كنت ستقوم بذلك للحصول على الكثير من الأرقام ..

نظرا لأن الرقم لا يحتوي على الأصفار الرائدة، فأنت تتحول على أي حال لإضافتها. لست متأكدا من السبب في أنك تحاول بجد لتجنب ذلك للعثور على الطول عندما تكون النتيجة النهائية ستكون سلسلة على أي حال.

يتم توفير حل واحد من قبل Base 10 Logarithm، مبالغة قليلا.

يمكنك حلقة من خلال وحذفها بحلول 10، عد عدد المرات التي تحمها؛

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

حسنا، لا أستطيع مقاومة: استخدم /=:

#include <stdio.h>

int
main(){
        int num = 423;
        int count = 1;
        while( num /= 10)
                count ++;
        printf("Count: %d\n", count);
        return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $ 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top