Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Είμαι αρχάριος σε ότι αφορά τον προγραμματισμό.Μας έχουν βάλει λοιπόν μια εργασία που μέσα στα ερωτήματα είναι να βρούμε και την υποακολουθία ενός αριθμού.Ο αριθμός αυτός δεν είναι κάποιος συγκεκριμένος απλά έχουμε κάνει ένα #define 1000000 και έχουμε ένα counter σε for.Μπορεί κάποιος να μου εξηγήσει τι ακριβώς κάνει αυτός ο αλγόριθμος.(είναι δωσμένος από τον καθηγητή.)

 

#include <stdio.h>
#define MAXNUMB 1000000
int main (void){
int i,num=MAXNUMB,mult=1,mask,sub=0,tempnum,combs=1;
tempnum=MAXNUMB;
while(tempnum!=0)
 { 
  tempnum/=10;
  combs+=combs;
 }      
              for (i=1;i<combs-1;i++)
              mask=i;
              mult=1;
              sub=0;
              num=MAXNUMB;
              while (num!=0)
   {
    if (mask%2==1)
     {
      sub+=(num%10)*mult;
      mult*=10;
}
       num/=10;
       mask/=2;


   } 
  

 

Δημοσ.

#include <stdio.h>
#define MAXNUMB 1000000
int main (void){
    int i,num=MAXNUMB,mult=1,mask,sub=0,tempnum,combs=1;
    tempnum=MAXNUMB;
    while(tempnum!=0)
    { 
        tempnum/=10;
        combs+=combs;        
        printf("tempnum=%d - - combs=%d \n",tempnum,combs);
    }      
    for (i=1;i<combs-1;i++)
    mask=i;
    mult=1;
    sub=0;
    num=MAXNUMB;
    while (num!=0)
    {
        if (mask%2==1)
        {
            sub+=(num%10)*mult;
            printf("sub=%d\n",sub);
            mult*=10;
            printf("mult=%d\n",mult);
        }
        num/=10;
        mask/=2;
        printf("num=%d - - mask=%d \n",num,mask);


    } }

Τρέξ'το τώρα και θα κάταλάβεις καλύτερα. Άν βλέπεις τις μεταβλητές τυπωμένες, θα σε βοηθήσει πάρα πολυ.

 

tempnum=100000 - - combs=2

tempnum=10000 - - combs=4

tempnum=1000 - - combs=8

tempnum=100 - - combs=16

tempnum=10 - - combs=32

tempnum=1 - - combs=64

tempnum=0 - - combs=128

num=100000 - - mask=63

sub=0

mult=10

num=10000 - - mask=31

sub=0

mult=100

num=1000 - - mask=15

sub=0

mult=1000

num=100 - - mask=7

sub=0

mult=10000

num=10 - - mask=3

sub=0

mult=100000

num=1 - - mask=1

sub=100000

mult=1000000

num=0 - - mask=0

 

Δημοσ. (επεξεργασμένο)

Είμαι αρχάριος σε ότι αφορά τον προγραμματισμό.Μας έχουν βάλει λοιπόν μια εργασία που μέσα στα ερωτήματα είναι να βρούμε και την υποακολουθία ενός αριθμού.Ο αριθμός αυτός δεν είναι κάποιος συγκεκριμένος απλά έχουμε κάνει ένα #define 1000000 και έχουμε ένα counter σε for.Μπορεί κάποιος να μου εξηγήσει τι ακριβώς κάνει αυτός ο αλγόριθμος.(είναι δωσμένος από τον καθηγητή.)

 

#include <stdio.h>
#define MAXNUMB 1000000
int main (void){
int i,num=MAXNUMB,mult=1,mask,sub=0,tempnum,combs=1;
tempnum=MAXNUMB;
while(tempnum!=0)
 { 
  tempnum/=10;
  combs+=combs;
 }      
              for (i=1;i<combs-1;i++)
              mask=i;
              mult=1;
              sub=0;
              num=MAXNUMB;
              while (num!=0)
   {
    if (mask%2==1)
     {
      sub+=(num%10)*mult;
      mult*=10;
}
       num/=10;
       mask/=2;


   } 

Δηλαδή θες να πεις ότι ο καθηγητής έχει γράψει αυτό τον κώδικα?? Δεν νομίζω Τάκη(pun intended)

 

 

 

Τέλος πάντων άκου για να καταλάβεις:

 

Αυτό που κάνεις εδώ

while(tempnum!=0)
 { 
  tempnum/=10;
  combs+=combs;
 }   

Δεν νομίζω οτι βοηθάει και πολύ... Όπως λέει και ο καθηγητής σου λοιπόν όλα τα πιθανά masks είναι από (1,2^d-1) όπου d τα ψηφία του εκάστοτε αριθμού.

 

Πάμε τώρα παρακάτω:

 

Σκέψου οτί το mask είναι ενας αριθμός στην δυαδική του αναπαράσταση (δηλαδη πχ 00010101)!(Στην πραγματικότητα απλά κοιτάει αν το ψηφίο είναι ζυγό ή όχι.)

Εσύ για να βρεις την υπακολουθία πρέπει να βάλεις (στο μυαλό σου) το NUMBER ακριβως από πάνω απο την δυαδική!

 

πχ έστω οτί το νούμερο ειναι

 

4356977

και το mask είναι 0001010

Έχουμε:

                   4356977

                   0001010

 

Εσύ πρέπει να δείς ποια ψηφία του NUMBER αντιστοιχούν σε '1'(Είπαμε δεν είναι '1' αλλά μονοί) στον απο κάτω και να τα κρατήσεις.. Αυτή είναι η υπακολουθία σου.

Αυτό το "ψάξιμο" γίνεται εδώ:

while (num!=0)
    {
        if (mask%2==1)
        {
            sub+=(num%10)*mult;
            mult*=10;
        }
        num/=10;
        mask/=2;

Εδώ πχ η υπακολουθία που παράγεται είναι το 67

 

Όπως καταλαβαίνεις  το mask όσο ανεβαίνει παίρνει όλους τους πιθανούς συνδιασμούς των υπακολουθιών.

 

Τώρα αν δεν καταλαβαίνεις πως λειτουργούν βάλε νούμερα και 'τρέξτα' στο μυαλό σου και αν και πάλι δεν καταλαβαίνεις πες μου να σου εξηγησω αργότερα που θα ξαναμπώ

Επεξ/σία από kaliakman
Δημοσ.

Σίγουρα αν αυτό είναι του καθηγητή τότε κλαίω για τα παιδιά που υποτίθεται ότι θα μάθουν από αυτό... αλλά ακόμα κι έτσι

for (i=1;i<combs-1;i++)
mask=i;

What. The. Fuck.

Δημοσ.

Δηλαδή θες να πεις ότι ο καθηγητής έχει γράψει αυτό τον κώδικα?? Δεν νομίζω Τάκη(pun intended)

 

 

 

Τέλος πάντων άκου για να καταλάβεις:

 

Αυτό που κάνεις εδώ

while(tempnum!=0)
 { 
  tempnum/=10;
  combs+=combs;
 }   

Δεν νομίζω οτι βοηθάει και πολύ... Όπως λέει και ο καθηγητής σου λοιπόν όλα τα πιθανά masks είναι από (1,2^d-1) όπου d τα ψηφία του εκάστοτε αριθμού.

 

Πάμε τώρα παρακάτω:

 

Σκέψου οτί το mask είναι ενας αριθμός στην δυαδική του αναπαράσταση (δηλαδη πχ 00010101)!(Στην πραγματικότητα απλά κοιτάει αν το ψηφίο είναι ζυγό ή όχι.)

Εσύ για να βρεις την υπακολουθία πρέπει να βάλεις (στο μυαλό σου) το NUMBER ακριβως από πάνω απο την δυαδική!

 

πχ έστω οτί το νούμερο ειναι

 

4356977

και το mask είναι 0001010

Έχουμε:

                   4356977

                   0001010

 

Εσύ πρέπει να δείς ποια ψηφία του NUMBER αντιστοιχούν σε '1'(Είπαμε δεν είναι '1' αλλά μονοί) στον απο κάτω και να τα κρατήσεις.. Αυτή είναι η υπακολουθία σου.

Αυτό το "ψάξιμο" γίνεται εδώ:

while (num!=0)
    {
        if (mask%2==1)
        {
            sub+=(num%10)*mult;
            mult*=10;
        }
        num/=10;
        mask/=2;

Εδώ πχ η υπακολουθία που παράγεται είναι το 67

 

Όπως καταλαβαίνεις  το mask όσο ανεβαίνει παίρνει όλους τους πιθανούς συνδιασμούς των υπακολουθιών.

 

Τώρα αν δεν καταλαβαίνεις πως λειτουργούν βάλε νούμερα και 'τρέξτα' στο μυαλό σου και αν και πάλι δεν καταλαβαίνεις πες μου να σου εξηγησω αργότερα που θα ξαναμπώ

Ναι απλά αυτο που προσπαθώ να καταλάβω είναι ξέρουμε ότι ένας αριθμός μπορεί να έχει παραπάνω από μία υποακολουθία..αυτό το βρίσκουμε ψάχνοντας διαφορετικά mask η κάθε αριθμός έχει μόνο ένα mask;;

Δημοσ.

Ναι απλά αυτο που προσπαθώ να καταλάβω είναι ξέρουμε ότι ένας αριθμός μπορεί να έχει παραπάνω από μία υποακολουθία..αυτό το βρίσκουμε ψάχνοντας διαφορετικά mask η κάθε αριθμός έχει μόνο ένα mask;;

Στο είπα και πριν. Το mask δεν είναι τίποτα άλλο παρά ένα νούμερο που αυξάνεται και το χρησιμοποιούμε ως σημείο αναφοράς για να πάρουμε την υπακολουθία.

Οπότε κάθε αριθμός έχει (2^d) -1 διαφορετικά mask όπου d τα ψηφία του αριθμού

Σίγουρα αν αυτό είναι του καθηγητή τότε κλαίω για τα παιδιά που υποτίθεται ότι θα μάθουν από αυτό... αλλά ακόμα κι έτσι

for (i=1;i<combs-1;i++)
mask=i;

What. The. Fuck.

Αν δεις(Που λογικό είναι να μην δεις έτσι όπως είναι γραμμένο) το mask το πειράζει μέσα στο σώμα οπότε δεν μπορεί να χρησιμοποιήσει το i αντί του mask

Δημοσ.

Αν δεις(Που λογικό είναι να μην δεις έτσι όπως είναι γραμμένο) το mask το πειράζει μέσα στο σώμα οπότε δεν μπορεί να χρησιμοποιήσει το i αντί του mask

 

Εκείνο το for δεν έχει braces. Θα εκτελεστεί μόνο για μια γραμμή το loop.

  • Like 1
Δημοσ.

Εκείνο το for δεν έχει braces. Θα εκτελεστεί μόνο για μια γραμμή το loop.

Α καλά.. Δεν κοίταξα καν συναντικά γιατί είναι απλά πολλά...Επιμένω οτί αυτός ο κώδικας δεν είναι αλλουνού αλλά δικός του.. Τα braces γενικά είναι ότι να ναι είναι σαν να τα έβαλε απλά για να έχει μερικά :ph34r:

@op no offense

Δημοσ.

Α καλά.. Δεν κοίταξα καν συναντικά γιατί είναι απλά πολλά...Επιμένω οτί αυτός ο κώδικας δεν είναι αλλουνού αλλά δικός του.. Τα braces γενικά είναι ότι να ναι είναι σαν να τα έβαλε απλά για να έχει μερικά :ph34r:

@op no offense

Για να λύσουμε αυτό το θέμα το συγκεκριμένο παράδειγμα έγινε από έναν βοηθό του μαθήματος.Τώρα αν ο βοηθός έγραφε άσχετα η εγώ δεν αντέγραψα σώστα δεν ξέρω.Όσο για τα braces τώρα μαθαίνω,άμα τα ήξερα όλα από την αρχή δεν χρειαζόταν να ρωτήσω εδώ!

Δημοσ.

Οι θέσεις των braces δεν έχουν καμία σημασία και σε μια γραμμή να το γράψεις όλο θα τρέξει. Αυτά είναι καθαρά για λόγους αναγνωσιμότητας θες να είναι όσο πιο καθαρογραμμένο γίνεται.

Δημοσ.

Η θέση των braces παίζει ρόλο όπως έγραψε και ο defacer.. Τώρα... Επιμένω για τον κώδικα.. Ο συγκεκριμένος δεν τρέχει καν.. Πως ακριβώς σας τον έδωσε?

Δημοσ.

@theotherone η θέση των braces (σε σχέση με whitespace δηλαδή) δεν παίζει ρόλο. Η παρουσία ή απουσία των braces παίζει όμως τεράστιο ρόλο.

  • Like 1
Δημοσ.

Η θέση των braces παίζει ρόλο όπως έγραψε και ο defacer.. Τώρα... Επιμένω για τον κώδικα.. Ο συγκεκριμένος δεν τρέχει καν.. Πως ακριβώς σας τον έδωσε?

Ο κώδικας όπως τον αντέγραψα

#include <stdio.h>
#define NUMBER 154

int main (void) 
{
  int i,num=NUMBER,mult=1,mask,sub=0,tempnum,combs=1;
         tempnum=NUMBER;
         while (tempnum!=0){
                tempnum/=10;
                combst=combos;
              }      
              for (i=1;i<combs-1;i++)
              mask=i;
              mult=1;
              sub=0;
              num=NUMBER;
              while (num!=0){
	           if (mask%2==1){
			    sub+=(num%10)*mult;
			    mult*=10;
			    }
                    num/=10;
	            mask/=2;
	            } 
	     printf ("%d \n",sub);   
             }
  

@theotherone η θέση των braces (σε σχέση με whitespace δηλαδή) δεν παίζει ρόλο. Η παρουσία ή απουσία των braces παίζει όμως τεράστιο ρόλο.

ναι δεν είναι το θέμα τα braces αυτά άμα τρέξεις τον κώδικα και σου βγάλει λάθος αποτέλεσμα η δεν τρέξει καθόλου καταλαβαίνεις λίγο πολύ ότι κάπου έχεις κάνει λάθος.Το θέμα είναι ότι προσπαθώ να βάλω σε μια τάξη το όλο θέμα γιατί πρέπει να βγάλω αν οι υποακολουθίες ενός αριθμού είναι πρώτοι αριθμοί ή όχι.Αλλά για να το βγάλω αυτό πρέπει να καταλάβω πως ακριβώς λειτουργούν οι υποακολουθίες μέσα στον κώδικα

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...