定義「A positive integer is a perfect number if it is equal to the sum of all its factors except itself.」。
例如:6 = 1 + 2 + 3;28 = 1 + 2 + 4 + 7 +14。
請以「隨機」的方式將 10000以內的 Perfect Number 印出。
有兩種方式,可以透過#define V1控制執行的解答方法
SOLUTION CODE
#include <stdio.h> #include <stdlib.h> #include <time.h> //#define V1 #ifdef V1 int main (int argc, char *argv[]) { int choice, step, i, j, sum, count, countOfPrint; int perfectNumber[100]; int *pMark; srand(time(NULL)); while(true) { choice = 0, step = 1, count = 0, countOfPrint = 0; //各種選擇、計數都先歸零 printf("請選擇\n (1)進入程式\n (2)離開程式\n> "); fflush(stdin); scanf_s("%d", &choice); if(choice == 1) { step = 2; printf("\n"); } else if(choice == 2) { printf("See you!!\n"); return 0; } else printf("\n輸入錯誤 請重新輸入\n\n"); if(step == 2) { //先把小於10000的prefect number找出來 for(i = 6;i <= 10000;i++) { //先計算sum of factor sum = 0; //計算總和前先歸零 for(j = 1;j < i;j++) { if(i%j == 0) sum = sum + j; } //檢驗perfect number if(i == sum) { perfectNumber[count] = i; count++; } } step++; } if(step == 3) { //進行"隨機"印出工作 int random; pMark = (int*)malloc(sizeof(int)*(count)); //配置用來標記已經被印出的數字的陣列 while(countOfPrint < count) { random = rand()%count; if(*(pMark+random) != 1) { //如果沒有印過,就先標記再印出 *(pMark+random) = 1; printf("%2d-th perfect number is %d\n", countOfPrint+1, perfectNumber[random]); countOfPrint++; } } printf("The perfect number which is less than 10000 have %d(s)\n\n", count); step++; } if(step == 4) //釋放掉pMark的記憶體 free(pMark); } system("pause"); return 0; } #else //實作動態記憶體 struct perfectNumber { int number; bool mark; perfectNumber *next; }; int main (int argc, char *argv[]) { int choice, step, i, j, sum, count, countOfPrint; perfectNumber *pPN, *pPNOfFrist; srand(time(NULL)); while(true) { choice = 0, step = 1, count = 0, countOfPrint = 0; //各種選擇、計數都先歸零 printf("請選擇\n (1)進入程式\n (2)離開程式\n> "); fflush(stdin); scanf_s("%d", &choice); if(choice == 1) { step = 2; printf("\n"); } else if(choice == 2) { printf("See you!!\n"); return 0; } else printf("\n輸入錯誤 請重新輸入\n\n"); if(step == 2) { //先把小於10000的prefect number找出來 pPN = (perfectNumber*)malloc(sizeof(perfectNumber)); //第一個 pPNOfFrist = pPN; for(i = 6;i <= 10000;i++) { //先計算sum of factor sum = 0; //計算總和前先歸零 for(j = 1;j < i;j++) { if(i%j == 0) sum = sum + j; } //檢驗perfect number if(i == sum) { pPN->number = i; pPN->mark = true; pPN->next = (perfectNumber*)malloc(sizeof(perfectNumber)); pPN = pPN->next; count++; } } pPN = pPNOfFrist; //把位置指回第一個 //將最後一個元素的next清空 for(i = 1;i < count;i++) pPN = pPN->next; pPN->next = NULL; pPN = pPNOfFrist; //再次只回第一個 step++; } if(step == 3) { //進行"隨機"印出工作 int random; while(countOfPrint < count) { pPN = pPNOfFrist; //回歸到第一個 //處理隨機的問題 random = rand()%count; for(i = 0;i < random;i++) pPN = pPN->next; if(pPN->mark) { //如果沒有印過,就先標記再印出 pPN->mark = false; printf("%2d-th perfect number is %d\n", countOfPrint+1, pPN->number); countOfPrint++; } } printf("The perfect number which is less than 10000 have %d(s)\n\n", count); step++; } } system("pause"); return 0; } #endif
沒有留言:
張貼留言