Εύρεση φίλων αριθμών, σε γλώσσα C.

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό UnKnown96 » 21 Ιούλ 2011, 22:05

Επείσης από ενδιαφέρον έφτιαξα και αυτό:
Κώδικας: Επιλογή όλων

#include <stdio.h>

int main (void)
{
int a, b, c = 0, d = 0;

printf ("Αριθμός: ");
scanf ("%d", &a);

for (b = 1; b < a; b++) {
if (a % b == 0) c += b; }

if (a == c) printf ("Ο αριθμός %d είναι τέλειος.\n", a);
else
for (b = 1; b < c; b++) {
if (c % b == 0) d += b; }

if (d == a) printf ("Ο αριθμός %d είναι φίλος με το %d.\n", a, c);
else printf ("Ο αριθμός %d δεν έχει φίλους.\n", a);

return 0;
}
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό konnn » 22 Ιούλ 2011, 12:51

Πρόσθεσα στο αρχικό μου ποστ τους φίλους μέχρι 100.000.Όποιος θέλει-ξέρει, μέχρι να μετατρέψω τον τελικό κώδικα σε ένα .deb ή να το βάλω στο git , ας βρει σε ένα επόμενο πεδίο ορισμού κάποιους φίλους.

Πρόσθεσα στον κώδικα να τυπώνει το πλήθος των ζευγαριών.

Κώδικας: Επιλογή όλων
/* Αυτό προγραμματάκι βρίσκει εάν ένας αριθμός έχει φίλο */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ABS(x) (x) > 0 ? (x) : -(x)

// -----------------------------------------------------------------------------
// Επιστρέφει το άθροισμα όλων των διαιρετών του num
//
int div_sum( int num )
{
int i=0, sum=0;

for (i=1; i <= num/2; i++)
if ( num % i == 0 ) // το i είναι διαιρέτης του num
sum += i; // πρόσθεσέ το στο sum

return sum;
}

// -----------------------------------------------------------------------------
int main( void )
{
FILE * pFile;
int low=0, high=0, num1=0, num2=0, num_of_pairs=0;

puts("ΣΗΜΕΙΩΣΗ:\nτυχόν αρνητικοί αριθμοί μετατρέπονται σε θετικούς!\n");
printf ("Κάτω όριο αναζήτησης (πλην του αριθμού 0): ");
scanf ("%d", &low);
low = ABS(low);

printf ("Άνω όριο αναζήτησης: ");
scanf ("%d", &high);
high = ABS(high);

if ( high < low ) // άνω όριο μεγαλύτερο του κάτω ορίου?
{ // ενάλλαξέ τα
int temp = low;
low = high;
high = temp;
}

/* Χρησιμοποιούμε έναν δυναμικό πίνακα χαρτογράφησης όλων των
* αριθμών μεταξύ low και high, που τον αρχικοποιούμε με την
* τιμή 0 σε όλα του κελιά. Όταν βρούμε έναν αριθμό num1 που έχει
* φιλικό αριθμό num2, χαρτογραφούμε τον num1 στον πίνακα με τιμή 1
* και τυπώνουμε το ζευγάρι στην οθόνη μόνο αν ο num2 δεν είναι
* ήδη χαρτογραφημένος.
*/
int lenmap = high - low; // μήκος του πίνακα χαρτογράφησης
char mapnums[ lenmap ]; // πίνακας χαρτογράφησης αριθμών
memset( mapnums, 0, lenmap * sizeof(char) ); // αρχικοποίηση πίνακα με 0

pFile = fopen ("myfile.txt","w");
if ( !pFile )
puts("\n\t*** σημείωση: το άνοιγμα του αρχείου απέτυχε\n");

putchar('\n');
for ( num1=low; num1 < high; num1++ )
{
num2 = div_sum( num1 );

if ( div_sum( num2 ) != num1 ) // ο num1 δεν έχει φιλικό αριθμό
continue;

// σε αυτό το σημείο οι num1 και num2 είναι φίλοι
// διότι: div_sum( num2 ) == num1

mapnums[num1-low] = 1; // χαρτογράφηση του num1

// τύπωμα του ζευγαριού αριθμών μόνο όταν δεν είναι ίσοι
// μεταξύ τους και μόνο όταν ο num2 είναι αχαρτογράφητος
if ( num1 != num2 && mapnums[num2-low] == 0 )
{
printf("Οι αριθμοί %d και %d είναι φίλοι.\n", num1, num2 );
num_of_pairs++;

if ( pFile )
fprintf(pFile, "Οι αριθμοί %d και %d είναι φίλοι.\n", num1, num2);
}
}
printf("Έχουμε %d ζευγάρια φίλων αριθμών\n", num_of_pairs);
fprintf(pFile, "Έχουμε %d ζευγάρια φίλων αριθμών.\n", num_of_pairs);

if ( pFile)
fclose (pFile);

fflush(stdin); getchar();
exit(EXIT_SUCCESS);
}
Τελευταία επεξεργασία από konnn και 22 Ιούλ 2011, 15:17, έχει επεξεργασθεί 1 φορά/ες συνολικά
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό migf1 » 22 Ιούλ 2011, 13:03

konnn έγραψε:Πρόσθεσα στο αρχικό μου ποστ τους φίλους μέχρι 100.000.
[snip]

Απλώς ενημερωτικά, αν κάνεις ένα απλό paste τον κώδικα στο http://ideone.com ή στο http://codepad.org (ή σε οποιοδήποτε συναφές site) μπορείς να του πεις να το κάνει compile και να το τρέχει, οπότε κάτω από τον κώδικα θα δείχνει και την έξοδο :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό konnn » 08 Αύγ 2011, 18:49

Παρακάτω βρίσκεται τελευταία η έκδοση του κώδικα όπου,φαινομενικά ως τώρα, δεν έχει κάποια προβλήματα.Λειτουργεί ως εξής:
βρίσκει όλα τα ζεύγη και τα τοποθετεί σε ένα πίνακα.Έπειτα αφαιρεί τα διπλότυπα.Άρα, τυπώνει μόλις ολοκληρωθεί ο αλγόριθμος.

Κώδικας: Επιλογή όλων
#include<stdio.h>

int func_sum(int num){
int div=0,sum=0;

for(div=1;div<=num/2;div++){
if((num%div)==0){

sum=sum+div;}

}
// printf("Το άθροισμά των διαιρέτων του %d είναι %d \n" ,num,b );


return sum;
}

int main(){
// int arr[50];
int *p;
int i,j,k,size,n;
//printf("\nEnter size of the array: ");
//scanf("%d",&n);

//printf("\nEnter %d elements into the array: ",n);
//for(i=0;i<n;i++)
// scanf("%d",&arr[i]);
int low=0,high=0,num=0,sum=0,l=0,m=0;

//n=high-low;
printf ("Δώσε το κάτω άκρο του πεδίου αναζήτησης πλην του αριθμού 0 και πατήστε enter :\n");

scanf ("%d",&low);

printf ("Δώσε το άνω άκρο του πεδίου αναζήτησης και πατήστε enter :\n");

scanf ("%d",&high);

if (high<low){
printf ("Δώσε το άνω άκρο του πεδίου αναζήτησης μεγαλύτερο του κάτω και πατήστε enter :\n");

scanf ("%d",&high); }

int arr[high-low];
for(num=low;num<high;num++){

sum=func_sum(num);
/*Τοποθέτηση σε πίνακα των ζευγαριών*/
if(func_sum(sum)==num && sum!=num){

arr[n]=num;
arr[n+1]=sum;
n=n+2;}
}
/*Ξεκαθάριση διπλότυπων*/
size=n;
p=arr;
for(i=0;i<size;i++){//Remove douplicates
for(j=0;j<size;j++){
if(i==j){
continue;
}
else if(*(p+i)==*(p+j)){
k=j;
size--;
while(k < size){
*(p+k)=*(p+k+1);
k++;
}
j=0;
}
}
}
printf("\nThe couples of friend numbers are %d,the: \n",size/2);
for(i=0;i < size;i=i+2){
printf(" %d and %d\n",arr[i],arr[i+1]);
}
return 0;
}
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό UnKnown96 » 17 Αύγ 2011, 22:43

Ρε παιδιά γιατί δεν δουλεύει αυτός ο κώδικας;;;

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

#include <stdio.h>

int main (void) {

int Start, End, Counter, Divisor, Friend, Check;

scanf ("%d %d", &Start, &End);

for (Counter = Start; Counter <= End; Counter++) {

for (Divisor = 1; Divisor < Counter; Divisor++) {
if (Counter % Divisor == 0) Friend += Divisor; }

for (Divisor = 1; Divisor < Friend; Divisor++) {
if (Friend % Divisor == 0) Check += Divisor; }

if (Counter == Check) printf ("%d %d\n", Counter, Friend); }

return 0; }
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό Qdata » 17 Αύγ 2011, 22:56

Δώσε μας το σφάλμα που σου πετάει.Υποψιάζομαι κάτι αλλά καλύτερα να το σιγουρέψω. :problem:
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό UnKnown96 » 17 Αύγ 2011, 23:09

Σφάλμα δεν πετάει, όταν όμως δώσω δύο νούμερα δεν δίνει αποτέλεσμα... Μόνο μία κενή γραμμή.
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό pmav99 » 18 Αύγ 2011, 00:29

Για να μην εκτυπώνει τίποτα, προφανώς η συνθήκη του If είναι πάντα ψευδής.

Δοκίμασες να εκτυπώσεις τις τιμές των check και friend? Κάντο, στην αρχή (μετά τη δήλωση τους, πριν τα loops) και στο τέλος (μετά το if) και θα καταλάβεις το λάθος σου.
Τελευταία επεξεργασία από pmav99 και 18 Αύγ 2011, 00:54, έχει επεξεργασθεί 1 φορά/ες συνολικά
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό Qdata » 18 Αύγ 2011, 00:40

Δώσε το αποτέλεσμα από τον παρακάτω κώδικα:
Κώδικας: Επιλογή όλων
#include <stdio.h>

int main (void)
{

int Start, End, Counter, Divisor, Friend, Check;

scanf ("%d %d", &Start, &End);

for (Counter = Start; Counter <= End; Counter++)
{

for (Divisor = 1; Divisor < Counter; Divisor++)
if (Counter % Divisor == 0) Friend += Divisor;

for (Divisor = 1; Divisor < Friend; Divisor++)
if (Friend % Divisor == 0) Check += Divisor;

printf ("%d %d\n", Counter, Friend);
}

return 0;
}
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Εύρεση φίλων αριθμών, σε γλώσσα C.

Δημοσίευσηαπό konnn » 18 Αύγ 2011, 10:50

@ QData:Τι θέλει να κάνει αυτό το προγραμματάκι;
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι