לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי         אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #3  
ישן 26-12-2014, 14:22
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,301
בתגובה להודעה מספר 1 שנכתבה על ידי ShitHead שמתחילה ב "הדפסת מספרים מ-1 עד ..."

אתה מתכוון להמציא את GMP מחדש? או שלהשתמש בה לצורך העניין זה בסדר... (ואז סביר שאתה יכול להגדיל שם מונה כל פעם באחד ולהשתמש ב gmp_printf() עם ה format string הרלוונטי, לדוגמא: %Zd)

או שאתה בכלל לא בונה על שימוש בערך המקסימלי האפשרי של double (לפי MSDN, מדובר על 1.79769e+308)? אם זה המצב, אז... נראה לי שהאפשרות האחרת היא פשוט מחרוזת שבה מקדמים "מספרים", או, לחלופין, מערך שהוא צירוף של מספר מונים (בהתאם לרוחב המספר שאתה רוצה לעשות). נניח שכל תא במערך יכיל מספר עד 999,999,999 (או מה שלא יהיה המספר מתחת למספר העגול שספרתו הראשונה לא תוכל להגיע ל 9 לפי סוג המשתנה), שאותו אתה פשוט תקדם עד שיגיע למספר הגבוה מהמספר הנ"ל - וכשיגיע - פשוט תאפס אותו, ותתחיל לקדם את המשתנה שבתא הסמוך לו במערך, עד שגם התא הסמוך יגיע לאותו מספר, וכך הלאה, עד שבעצם סט הספרות במערך יגיע לערך שאליו אתה מצפה שהוא ידוע מראש (אתה יכול לחלק את מחרוזת הקלט שמכילה את מספר היעד לקבוצות בגודל המדובר, לעשות על כל חלק atoi(), ולעשות מערך עם מפתחות מקבילים המכילים את מספר היעד של כל חלק. כמובן שאם מספר היעד אינו עגול, תצטרך לבדוק כל פעם את כל המפתחות שעוד לא הגיעו ליעד, משמאל לימין).

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

אולי לאלה שכן עשו תואר בהנדסת תוכנה יהיה פתרון יצירתי יותר
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 26-12-2014, 15:58
צלמית המשתמש של ai22
  משתמש זכר ai22 ai22 אינו מחובר  
 
חבר מתאריך: 29.09.09
הודעות: 11,044
זה לא בעיה
בתגובה להודעה מספר 4 שנכתבה על ידי ShitHead שמתחילה ב "לא הכרתי את GMP, טוב להכיר..."

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

לגבי ההעלאה:
בלולאה החיצונית תעלה ב1 את האיבר הראשון, ואז תעשה לולאה פנימית:
כל עוד הספרה באיבר הנוכחי היא 10 - תאפס את האיבר הנוכחי, תעלה ב1 את האיבר הבא - ותמשיך בלולאה לאיבר הבא.
ברגע שהאיבר לא 10 - גמרת את ההעלאה וצא מהלולאה הפנימית.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 26-12-2014, 16:10
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,301
בתגובה להודעה מספר 4 שנכתבה על ידי ShitHead שמתחילה ב "לא הכרתי את GMP, טוב להכיר..."

תסלח לי שאני לא כותב את זה ב C++/C, כן? זה אמור להיות מספיק קרוב, רק בלי ההקצאות והגדרות המשתנים (והמרת המחרוזת ל int באמצעות atoi() כי יש casting אוטומטי). האלגוריתם אמור להיות ברור. כאן הוספתי פשוט אפסים לפני המספר (leading zeros) באמצעות str_pad() כדי להתחשב במצב שבו עברת את התחום של המשתנה הבודד במערך. זה לא בדיוק יפה, וכמובן אפשר לעשות את זה יפה יותר, אבל סגנון הפלט זו הבעייה הקטנה כאן...

לא ממש בדקתי לעומק (בייחוד לא שגיאות off-by-one ), ובהחלט ייתכן שיש באגים, אבל מקווה שזה מספיק קרוב לפסודו-קוד שאתה מחפש...

הנה:
קוד PHP:
<?php

$target
='2937353762793725767534';
$targettmp $target;

while (
strlen($target) > 0) {
        
$targetarr[] = substr($target, -9);
        
$target substr($target0, -9);
}

$arrsize count($targetarr);

echo 
"\nTarget number $targettmp will be contained in $arrsize variables: ".implode(", "$targetarr)."\n";
unset(
$targettmp);

for(
$i=0$i $arrsize$i++)
        
$arr[$i] = 0;

$done false;

while (!
$done) {

        
$arr[0]++;

        for (
$i 0$i $arrsize$i++) {
                if (
$arr[$i] > 999999999) {
                        
$arr[$i+1]++;
                        
$arr[$i] = 0;
                }
        }

        for (
$i=$arrsize$i 0$i--)
                echo 
str_pad($arr[$i-1], 9'0'STR_PAD_LEFT);

        echo 
"\n";

        
$found true;

        for (
$i 0$i $arrsize$i++)
                if (
$arr[$i] != $targetarr[$i])
                        
$found false;

        if (
$found)
                
$done true;
}
?>
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
נמאס לכם לזכור סיסמאות? לחצו כאן!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 00:26

הדף נוצר ב 0.14 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2019 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר