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

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



  #2  
ישן 26-04-2008, 13:47
צלמית המשתמש של minimax
  משתמשת נקבה minimax minimax אינו מחובר  
 
חבר מתאריך: 28.10.01
הודעות: 10,153
שלח הודעה דרך MSN אל minimax Facebook profile
בבקשה: ניסיון שלי ראשון
בתגובה להודעה מספר 1 שנכתבה על ידי Psy_Man שמתחילה ב "רקורסיה+backtracking"

הקוד הנ"ל עובר קומפיציה בC, ועובד נכון. עבור n=8 ו k=3 הוא מדפיס :
242
152
062
503
413
323
233
143
053
404
314
224
134
044
305
215
125
035
206
116
026
107
017
008

עדיין לא התגברתי על ההדפסות הכפולות, אבל אפשר לעשות את זה. אולי בהמשך.

הנה הקוד, שהוא די פשוט. הכנסתי הרבה הדפסות עזר שיכולות לעזור.

קוד:
#define LEVEL 3 #include "iostream.h" #include "stdio.h" #include "string.h" #include "stdlib.h" void f(int n,int k,int s[50]) { if (k==0 && n==0) { // cout<<"solution"<<endl; for(int i=1;i<=LEVEL;++i) cout<<s[i]; cout<<endl; } else if (k==0 && n!=0) { //cout<<"no solution"<<endl; // cout<<s<<endl; // cout<< k<<n<< endl; } else { for (int i=0;i<=n;++i) { //cout<<"f:"<<endl; //cout<<s<<endl; //cout<<k<<n<<i<<endl; s[k]=i; f(n-i,k-1,s); } } } void main() { int s[50]; for(int i=0;i<=49;++i) s[i]=0; f(8,LEVEL,s); }
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 26-04-2008, 18:09
  md0 md0 אינו מחובר  
 
חבר מתאריך: 26.04.08
הודעות: 2
הצעה לפתרון אחר
בתגובה להודעה מספר 1 שנכתבה על ידי Psy_Man שמתחילה ב "רקורסיה+backtracking"

אפשר להסתמך קצת על המתמטיקה בשביל לחסוך כאן בזכרון:
נניח עבור הקלט n=5, k=3, בטור הראשון יהיו את המספרים 0 ו1, בעוד בתור השני יהיו את המספרים 0, 1 ו2.
בעצם, בכל טור (מלבד האחרון) המספר הכי נמוך יכול להיות 0, והמספר הכי גבוה יכול להיות שורש K של N.
עבור טור שלישי: שורש 3 של 5
עבור טור שני: שורש 2 של 5
וכך הלאה.

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

ה&quot;כיעור&quot; בדוגמת הקוד שאני אביא נובע בגלל ההדפסה הדרושה, לכן רשמתי גם בpython וגם בC++ (דווקא C++ ולא C, כי יש שם את std::string)

הקוד בpython:
קוד:
from math import ceil def f(n, k, prev = &quot;&quot;, caller = 0): if k == 1: if n >= caller: return n return None root = int(ceil(n**(1.0 / k))); # n**(1.0/k) = root K of N for x in xrange(caller, root + 1): l = str(prev) + str(x) + &quot; &quot; res = f(n-x, k-1, l, x) if res is not None: print l + str(res) return None



ובC++:
קוד:
#include <iostream> #include <string> #include <cmath> using namespace std; int f(int n, int k, string previous, int caller) { if (k == 1) { if (n >= caller) { return n; } } else { int root = (int)pow(n, 1.00 / k); root = (int)ceil(root); for (int i = caller; i <= root + 1; i++) { string newPrev(previous); char *buffer = new char[255]; sprintf(buffer, &quot;%d &quot;, i); newPrev += buffer; int result = f(n - i, k - 1, newPrev, i); if (result != -1) { // Not failing result cout << newPrev << result << endl; } } } return -1; }; int main() { int n, k; cout << &quot;Enter n: &quot;; cin >> n; cout << &quot;Enter k: &quot;; cin >> k; f(n,k, &quot;&quot;, 0); return -1; }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

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

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

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

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



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

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

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

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