από 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
Αυτόματη υπογραφή.