Τριγωνικοί αριθμοί

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
id8200
Δημοσιεύσεις: 1
Εγγραφή: 23 Απρ 2011 15:39

Τριγωνικοί αριθμοί

Δημοσίευση από id8200 » 23 Απρ 2011 16:10

Καλησπέρα,
Θέλω την βοήθεια σας.

Ένας αριθμός ονομάζεται τριγωνικός όταν ισούται με το άθροισμα ορισμένων διαδοχικών ακεραίων αριθμών με πρώτο το 1.
Για παράδειγμα:
1=1
3=1+2
6=1+2+3
10=1+2+3+4
15=1+2+3+4+5
21=1+2+3+4+5+6
28=1+2+3+4+5+6+7

Χρειάζομαι πρόγραμμα σε απλή C η assembly (προτιμώ C) που θα δείχνει ποιός κατά σειρά τριγωνικός αριθμός είναι αυτός που του δίνω.
Για παράδειγμα το 10 είναι κατά σειρά ο τέταρτος τριγωνικός αριθμός.
Το 28 είναι κατά σειρά ο έβδομος τριγωνικός αριθμός κ.ο.κ.

Ευχαριστώ προκαταβολικά.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

Τριγωνικοί αριθμοί

Δημοσίευση από LightForce » 29 Απρ 2011 19:46

Σίγουρα υπάρχει πιο elegant λύση, πάντως..

Κώδικας: Επιλογή όλων

int isT(n)
{
        int x = 0;
        int p = 0;

        while(n > x) x+= ++p;
        return (x == n) ? p : 0;
}

Άβαταρ μέλους
c0d3punk
Honorary Member
Δημοσιεύσεις: 1076
Εγγραφή: 15 Σεπ 2008 22:32
Τοποθεσία: Puerto pollo
Επικοινωνία:

Τριγωνικοί αριθμοί

Δημοσίευση από c0d3punk » 30 Απρ 2011 01:14

βρήκα τον παρακάτω κώδικα από εδώ:

Κώδικας: Επιλογή όλων

#include <stdio.h>

unsigned triangularNumber&#40;unsigned n&#41;;

const char *suffix&#91;&#93; = &#123;" ","st","nd","rd"&#125;;

int main&#40;int argc, char *argv&#91;&#93;&#41; &#123;
int n = 0,m;
unsigned t;

if &#40;&#40;argc < 2&#41; ||
&#40;sscanf&#40;argv&#91;1&#93;,"%d",&n&#41; != 1&#41; ||
&#40;n <= 0&#41;&#41; &#123;
printf&#40;"\nusage %s <n>\n",argv&#91;0&#93;&#41;;
printf&#40;" where <n> is a positive integer\n"&#41;;
return -1;
&#125;
t = &#40;int&#41;&#40;n * &#40;&#40;&#40;float&#41;n + 1.0&#41; / 2.0&#41;&#41;;
if &#40;t == triangularNumber&#40;n&#41;&#41; &#123;
m = n % 10;
printf&#40;"\nThe %d%s triangular number is %d\n",
n,
&#40;&#40;m > 0&#41; && &#40;m < 4&#41;&#41; ? suffix&#91;m&#93; &#58; "th",
t&#41;;
&#125; else &#123;
printf&#40;"\nerror\n"&#41;;
&#125;
return 0;
&#125;

unsigned triangularNumber&#40;unsigned n&#41; &#123;
if &#40;n == 1&#41; return 1;
return n + triangularNumber&#40;n-1&#41;;
&#125;
δεν τον δοκίμασα αν σου κάνει την δουλειά αλλά έχω την εντύπωση ότι κάνει το αντίστροφο από αυτό που ζητάς.... ρίξτου μια ματιά και πες μου γιατί το 'χω απορία...
like ants in a colony we do our share
but there's so many other f****' insects out there || Ανανεωμένα Παρτάλια || biZfind.gr

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

Τριγωνικοί αριθμοί

Δημοσίευση από nirvana » 01 Μάιος 2011 13:50

Επεισης αν ξερεις οτι το προγραμμα θα δεχετε συνήθως π.χ. αριθμους ως το 100 βαλε τους πρώτους 15 τριγωνικους σε ένα πινακα για να τους συγκρίνεις με την είσοδό σου.

Ετσι γλιτώνεις κάποιες επαναλήψεις και κάνεις μια μικρή βελτιστοποίηση.

GReaper
Δημοσιεύσεις: 48
Εγγραφή: 11 Δεκ 2010 21:47
Επικοινωνία:

Τριγωνικοί αριθμοί

Δημοσίευση από GReaper » 03 Μάιος 2011 21:17

Ξέρεις τίποτα από εξισώσεις?

Οι τριγωνικοί αριθμοί δήνωνται απ'τη παρακάτω ακολουθία:
T(n) = (n*(n+1))/2 , n Ε N*

Αν υποθέσουμε ότι ο χρήστης δίνει μια τιμή k τότε:
T(n) = k <=>
(n*(n+1))/2 = k <=>
n^2 + n - 2k = 0

Για να μην πολυλογώ, αν λύσεις την παραπάνω και απορρίψεις τις αρνητικές λύσεις:
n = (-1 + sqrt(8k + 1))/2, k E N*

Αν το αποτέλεσμα δεν είναι ακέραιο, τότε το k δεν είναι τριγωνικός, αλλιώς έχεις το n

Απλά πράγματα... :D

EDIT: Βέβαια αυτή η λύση είναι χρησιμότερη ( γρηγορότερη ) για μεγάλους και τυχαίους αριθμούς, αλλιώς η απλή πρόσθεση μπορεί να είναι καλύτερη!

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

Τριγωνικοί αριθμοί

Δημοσίευση από mariosal » 03 Μάιος 2011 22:38

O( logn ) λύσις.

Κώδικας: Επιλογή όλων

#include <math.h>
#include <stdio.h>

double N, K;

int main&#40;&#41; &#123;
    scanf&#40; "%lf", &K &#41;;

    N = &#40; -1 + sqrt&#40; 1 + 8 * K &#41; &#41; / 2;

    if &#40; N > 0 && N == &#40; long long &#41;N && K == &#40; long long &#41;K &#41; &#123;
        printf&#40; "N = %.0lf\n", N &#41;;
    &#125;
    else &#123;
        printf&#40; "%lf is not a triangular number.\n", K &#41;;
    &#125;

    return 0;
&#125;

Τελευταία επεξεργασία από το μέλος mariosal την 12 Μάιος 2011 17:44, έχει επεξεργασθεί 1 φορά συνολικά.

GReaper
Δημοσιεύσεις: 48
Εγγραφή: 11 Δεκ 2010 21:47
Επικοινωνία:

Τριγωνικοί αριθμοί

Δημοσίευση από GReaper » 04 Μάιος 2011 13:10

Καλή υλοποίηση εκτός από κάποιες μικρές ατέλειες:

Πρέπει να ελέγχεται αν K > 0, επειδή δεχόμαστε μόνο φυσικούς αριθμούς εκτός του μηδενός. ( Πριν την εύρεση του N )

Επίσης ο έλεγχος K == (long long)K θα ήταν καλύτερα να γίνεται πριν την εύρεση του Ν

Με την προσθήκη των παραπάνω ο έλεγχος N > 0 είναι περιττός επειδή η επιλεγμένη συνάρτηση θα παράγει μόνο θετικούς αριθμούς.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες