דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. פירוק ספרות משמאל לימין

פירוק ספרות משמאל לימין

מתוזמן נעוץ נעול הועבר תכנות
8 פוסטים 5 כותבים 274 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yyyY מנותק
    yyyY מנותק
    yyy
    כתב ב נערך לאחרונה על ידי
    #1
    static void scanNumLR(int num)
           {
               while (num > 0)
               {
                   int tempNum = num;
                   int counter = 0;
                   while (tempNum > 10)
                   {
                       tempNum /= 10;
                       counter++;
                   }
                   Console.WriteLine(tempNum);
                   num -= (int)(tempNum * Math.Pow(10, counter));
               }
                    
           }
    

    מרגיש לי לא יעיל עד כאב . (While^2) יש למישהו הצעה לשיפור? (בדגש על דרך מתמטית ולא סריקת סטרינג וכדו')
    תודה רבה

    אבייא dovidD 2 תגובות תגובה אחרונה
    0
    • אבייא מנותק
      אבייא מנותק
      אביי
      השיב לyyy ב נערך לאחרונה על ידי
      #2

      @yyy

      static void scanNumLR(int num)
      {
          while (num > 0)
          {
              int tempNum = num % 10;
              Console.WriteLine(tempNum);
              num /= 10;
          }
      }
      
      

      מחברינו ChatGPT (הוא לפחות טען לי מקודם שהוא ממש רוצה להיות חבר שלי...🤣)

      אגב, שים לב שמבחינתו הבעיה היא שבגלל ששאלתי בעברית אני רוצה את המספרים מימין לשמאל...

      i me:
      האם אתה יכול לייעל עבורי את הקוד הזה? static void scanNumLR(int num)
             {
                 while (num > 0)
                 {
                     int tempNum = num;
                     int counter = 0;
                     while (tempNum > 10)
                     {
                         tempNum /= 10;
                         counter++;
                     }
                     Console.WriteLine(tempNum);
                     num -= (int)(tempNum * Math.Pow(10, counter));
                 }
                      
             }
      
      ChatGPT:
      כנראה שאתה מנסה לכתוב פונקציה שמסודרת את מספר מספרי לפי סדר לפידים ימינה לשמאל אך אני מרגיש כי קוד זה לא יעבוד כמו שאתה מכיר.
      
      אם זה מה שאתה מנסה לעשות, אני מציע לכתוב פונקציה כזו:
      
      Copy code
      static void scanNumLR(int num)
      {
          while (num > 0)
          {
              int tempNum = num % 10;
              Console.WriteLine(tempNum);
              num /= 10;
          }
      }
      הפונקציה עובדת על ידי מחלקת את המספר עד שנשאר רק ספרה אחת בכל פעם. כך, כל פעם שנשאר ספרה אחת, הפונקציה תדפיס את הספרה ותמשיך למחלק עד שהמספר הנוכחי הוא אפס.
      
      אם אתה רוצה שהפונקציה תדפיס את המספר בסדר הפונקציה שלך (לפידים ימינה לשמאל), ניתן לשנות את הפונקציה כך:
      
      Copy code
      static void scanNumLR(int num)
      {
          string numStr = num.ToString();
          for (int i = numStr.Length - 1; i >= 0; i--)
          {
              Console.WriteLine(numStr[i]);
          }
      }
      בפונקציה זו, אנחנו משתמשים במתודת ToString כדי להמיר את המספר למחרוזת, ואז משך
      
      
      
      

      ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
      הלינקיה שלי https://abaye.co/link.html

      תגובה 1 תגובה אחרונה
      3
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        השיב לyyy ב נערך לאחרונה על ידי
        #3

        @yyy לא מבין מה הפלט הרצוי, ומסקרן אותי אם כבר לדעת מה המטרה.
        (הפונקציה שלך מחזירה 1225 למספר 120,250 זה מה שאתה רוצה?)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        קומפיונטק תגובה 1 תגובה אחרונה
        2
        • קומפיונטק מנותק
          קומפיונטק מנותק
          קומפיונט
          השיב לdovid ב נערך לאחרונה על ידי
          #4

          @yyy התשובה ש @אביי הביא היא מצוינת מימין לשמאל, ומה שאתה צריך זה משמאל לימין. אז נראה לי שבמקום לחפש אלגוריתם לפרק משמאל לימין (פחות עדיף בעיני, כי זה יותר מורכב ויותר קוד) אפשר פשוט לפרק מימין לשמאל ולהשתמש בפונקציית Reverse.

          אני נגיד הייתי כותב את זה ככה:

          public static IEnumerable<int> ScanNumber(int value)
          {
              for (int x = value; x > 0; x /= 10)
              {
                  yield return x % 10;
              }
          }
          
          public static IEnumerable<int> ScanNumber(int value, bool reverse)
          {
              var source = ScanNumber(value);
              return reverse ? source.Reverse() : source;
          }
          
          תגובה 1 תגובה אחרונה
          2
          • yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי yossiz
            #5

            הנה פתרון מהבינה הלא-מלאכותית שלי:

            static IEnumerable<int> ScanNumberLTR(int num)
            {
            	int magnitude = (int)Math.Log10(num);
            	for (int i = magnitude; i >= 0; i--)
            	{
            		yield return (num / (int)Math.Pow(10, i) % 10);
            	}
            }
            

            נ.ב. אני לא ממליץ על פתרון זו, אישית הייתי עושה משהו כזה:

            static IEnumerable<char> ScanNumberLTRs(int num)
            {
            	return num.ToString();
            }
            

            זה הכי פשוט לקריאות, אבל פותח הנושא ביקש "דרך מתמטית"
            במקום השני הייתי הולך על דרך ה-AI וקומפיונט, והייתי מחשבן קודם כל את המחרוזת המלאה משמאל לימין ואז הייתי מהפך אותו,
            נראה לי שזה יותר יעיל בביצועים ופחות יעיל בשימוש בזכרון
            הפתרון שלי בא לפתור את השאלה בדיוק כפי שפותח הנושא הציג אותה

            ואם כבר, אז צריך "דרך מתמטית" להמיר ספרה לתו... אז הנה:

            char Digit2Char(int digit)
            {
            	return (char)(digit + 48);
            }
            
            foreach (int c in ScanNumberLTR(204300234))
            {
            	Console.WriteLine(Digit2Char(c));
            }
            

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            קומפיונטק תגובה 1 תגובה אחרונה
            2
            • קומפיונטק מנותק
              קומפיונטק מנותק
              קומפיונט
              השיב לyossiz ב נערך לאחרונה על ידי קומפיונט
              #6

              אם לא אכפת לו באמצעות מחרוזת, אז זה הייתי עושה את זה ככה:

              (עריכה: לי זה היה פשוט, אבל שכחתי לציין שהקרדיט מגיע ל @yossiz על הטריק להמרת char למספר)

              public static IEnumerable<int> ScanNumberUsingString(int value)
              {
                  string str = value.ToString();
               
                  for (int i = str.Length - 1; i >= 0; i--)
                  {
                      yield return str[i] - 48;
                  }
              }
              
              yossizY תגובה 1 תגובה אחרונה
              0
              • yossizY מנותק
                yossizY מנותק
                yossiz
                השיב לקומפיונט ב נערך לאחרונה על ידי yossiz
                #7

                @קומפיונט אחרי תיקון קטן לקוד שלי (חסכתי כמה קריאות ל-Math.Pow) נוכחתי לראות שהוא יותר יעיל משלך גם בזמן מעבד (לזה לא ציפיתי) וגם בזכרון (זה מובן)

                b5c33c3c-e3e5-4f0e-b1f8-d429e55084c2-CleanShot 2022-12-16 at 12.59.25.png

                הקוד המתוקן:

                IEnumerable<long> ScanNumberLTR(long num)
                {
                	long magnitude = (long)Math.Log10(num);
                	long divisor = (long)Math.Pow(10, magnitude);
                	for (long i = magnitude; i >= 0; i--)
                	{
                		yield return (num / divisor % 10);
                		divisor = divisor / 10;
                	}
                }
                

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                תגובה 1 תגובה אחרונה
                1
                • yossizY מנותק
                  yossizY מנותק
                  yossiz
                  כתב ב נערך לאחרונה על ידי
                  #8

                  תירגמתי את הקוד ל-JS ושם הקוד שלי פחות יעיל משל @קומפיונט

                  https://jsben.ch/bgqxi

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  תגובה 1 תגובה אחרונה
                  1

                  בא תתחבר לדף היומי!
                  • התחברות

                  • אין לך חשבון עדיין? הרשמה

                  • התחברו או הירשמו כדי לחפש.
                  • פוסט ראשון
                    פוסט אחרון
                  0
                  • דף הבית
                  • קטגוריות
                  • פוסטים אחרונים
                  • משתמשים
                  • חיפוש
                  • חוקי הפורום