Untitled
unknown
plain_text
a year ago
12 kB
11
Indexable
#include <stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> void makeHappiness(char input[]){ printf("Happy %s",input); } int is_vowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'|| c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'; } void calculateHappinessScore(char input[]){ // khởi tạo 1 mảng int 256 phần tử, mỗi phần tử đều có giá trị 0 int score = 0; for(int i = 0; input[i] != '\0'; i++){ score += is_vowel(input[i])?(int)input[i]:0; } printf("Happiness Score: %d",score); if(score > 100){ printf(" (Happy)\n"); } else { printf(" (Unhappy)\n"); } } int isPrime(int n){ for(int i = 2; i <= sqrt(n); i++){ if(n%i == 0){ return 0; } } return n>1; } //kiểm tra 1 số có phải là lũy thừa của cơ số 2 hay không int isPowerOfTwo(int n){ return n>0 && (n & (n-1)) == 0; } //kiểm tra 1 có tổng các chữ số là lũy thừa của 2 hay không int is_happy_number(int n){ int sum = 0; while(n > 0){ sum += n%10; n /= 10; } return isPowerOfTwo(sum); } //Hàm chuyển chuỗi thành số nguyên int stringToInt(char input[]){ int n = 0; for(int i = 0; input[i] != '\0'; i++){ n = n*10 + (input[i] - '0'); } return n; } int sumOfDigits(int n){ int sum = 0; while(n > 0){ sum += n%10; n /= 10; } return sum; } int findHappinestNumber(char input[]) { // Calculate the length of input string and allocate buffer dynamically int len = strlen(input); char *buffer = (char*)malloc((len + 1) * sizeof(char)); if(len==0) return 0; //Fix (maybe) //initial // strncpy(buffer, input, len + 1); // fixed strcpy(buffer, input); buffer[len] = '\0'; char *pch; pch = strtok(buffer, ","); int result = 0; while (pch != NULL) { int n = stringToInt(pch); if (isPrime(n) && is_happy_number(n)) { //Whether > or >= ??? if (sumOfDigits(n) > sumOfDigits(result)) { result = n; } } pch = strtok(NULL, ","); } return result; } //đếm số lượng nguyên âm khác nhau int countVowels(char input[]){ int count = 0; int vowels[256] = {0}; for(int i = 0; input[i] != '\0'; i++){ if(is_vowel(input[i]) && vowels[input[i]] == 0){ count++; vowels[input[i]] = 1; } } return count; } void find_happiest_string(char *input, char *result, int* max_score) { int len = strlen(input); *max_score = 0; char *temp = (char*)malloc((strlen(input) + 1)*sizeof(char));; for (int i = 0; i < len; i++) { if (is_vowel(input[i])) { int score = 0; int temp_len = 0; //i love you for (int j = i; j < len; j++) { if (is_vowel(input[j])) { score += input[j]; temp[temp_len++] = input[j]; } } temp[temp_len] = '\0'; printf("temp in i: %s\n",temp); if (is_happy_number(score) && score > *max_score) { *max_score = score; strcpy(result, temp); } else if (is_happy_number(score) && score == *max_score) { if (strlen(temp) < strlen(result) && countVowels(temp) > countVowels(result)) { strcpy(result, temp); } else if (strlen(temp) == strlen(result) && countVowels(temp) == countVowels(result) && strcmp(temp, result) > 0) { strcpy(result, temp); } } } } } void to_hop(char *chuoi, char *hien_tai, int index, char ket_qua[][MAX_LENGTH], int *count) { // Thêm tổ hợp hiện tại vào mảng kết quả strcpy(ket_qua[(*count)++], hien_tai); // Lặp qua tất cả các ký tự còn lại trong chuỗi for (int i = index; i < strlen(chuoi); ++i) { hien_tai[strlen(hien_tai)] = chuoi[i]; to_hop(chuoi, hien_tai, i + 1, ket_qua, count); hien_tai[strlen(hien_tai) - 1] = '\0'; // Loại bỏ ký tự cuối cùng để thử tổ hợp mới } } void maximizeHappiestScore(char input[]) { char *happiest_string = (char*)malloc((strlen(input) + 1)*sizeof(char)); int max_score = 0; int count = 0; char *hien_tai = (char*)malloc((strlen(input) + 1)*sizeof(char)); char **ket_qua = (char**)malloc(pow(2,strlen(input))*sizeof(char*)); for(int i = 0; i < pow(2,strlen(input)); i++){ ket_qua[i] = (char*)malloc((strlen(input) + 1)*sizeof(char)); } to_hop(input, hien_tai, 0, ket_qua, &count); if (max_score > 100) { printf("Happiest String: %s\nHappiest Score: %d (Happy)\n", happiest_string, max_score); } else { printf("Happiest String: %s\nHappiest Score: %d (Unhappy)\n", happiest_string, max_score); } } typedef struct { char* name; int happinessLevel; } Member; typedef struct { Member* members; int numMembers; int happinessLevel; } Group; int compareMembers(const void* a, const void* b) { return ((Member*)b)->happinessLevel - ((Member*)a)->happinessLevel; } int getNextMemberNotAdded(int *added, int numMembers, int start){ for(int i = start+1; i < numMembers; i++){ if(added[i] == 0){ return i; } } return -1; } Group* splitGroups(Member* const members, int numMembers, int standardLevel) { if (numMembers == 0) return NULL; // Sort members by happinessLevel in descending order qsort(members, numMembers, sizeof(Member), compareMembers); Group* groups = (Group* )malloc(numMembers * sizeof(Group)); int nGroup = 0; int *added = malloc(numMembers * sizeof(int)); //Khởi tạo mảng added for(int k = 0; k < numMembers; k++){added[k] = 0;} for (int i = 0; i < numMembers; i++) { groups[nGroup].members = (Member*)malloc(numMembers * sizeof(Member)); groups[nGroup].numMembers = 0; groups[nGroup].happinessLevel = 0; for (int j = 0; j < numMembers; j++) { if(added[j] == 1) continue; if(groups[nGroup].happinessLevel + members[j].happinessLevel >= standardLevel){ //Nếu không còn thằng nào cộng lại lớn hơn int nextIdx = getNextMemberNotAdded(added,numMembers,j); // if (nextIdx==-1) break; if (nextIdx ==-1 || groups[nGroup].happinessLevel + members[nextIdx].happinessLevel < standardLevel){ groups[nGroup].members[groups[nGroup].numMembers] = members[j]; groups[nGroup].happinessLevel += members[j].happinessLevel; groups[nGroup].numMembers++; added[j] = 1; break; } else continue; } else{ groups[nGroup].happinessLevel += members[j].happinessLevel; //Gắn vào cuối mảng nhóm groups[nGroup].members[groups[nGroup].numMembers] = members[j]; groups[nGroup].numMembers++; added[j] = 1; } // if (groups[nGroup].happinessLevel + members[j].happinessLevel >= standardLevel) { // groups[nGroup].members[groups[nGroup].numMembers] = members[j]; // groups[nGroup].happinessLevel += members[j].happinessLevel; // groups[nGroup].numMembers++; // i = j; // Move to next member // break; // } else { // groups[nGroup].members[groups[nGroup].numMembers] = members[j]; // groups[nGroup].happinessLevel += members[j].happinessLevel; // groups[nGroup].numMembers++; // } } // If group happinessLevel is greater than or equal to standardLevel, prepend "Happy " to names if (groups[nGroup].happinessLevel >= standardLevel) { for (int k = 0; k < groups[nGroup].numMembers; k++) { char* newName = malloc(strlen(groups[nGroup].members[k].name) + 6); strcpy(newName, "Happy "); strcat(newName, groups[nGroup].members[k].name); free(groups[nGroup].members[k].name); groups[nGroup].members[k].name = newName; } nGroup++; } else { free(groups[nGroup].members); } } return groups; } // void printGroups(Group* groups, int numGroups) { // for (int i = 0; i < numGroups; i++) { // printf("Group %d: [", i); // for (int j = 0; j < groups[i].numMembers; j++) { // if (j > 0) printf(", "); // printf("{\"%s\", %d}", groups[i].members[j].name, groups[i].members[j].happinessLevel); // } // printf("]\n"); // } // } // int main() { // Member members[] = { // {"Alice", 5}, // {"Bob", 7}, // {"Charlie", 3}, // {"David", 8}, // {"Eve", 6}, // {"Frank", 4}, // {"Grace", 9}, // {"Henry", 2}, // {"Ivan", 1} // }; // int numMembers = sizeof(members) / sizeof(members[0]); // int standardLevel = 6; // int numGroups = 0; // Group* groups = splitGroups(members, numMembers, standardLevel, &numGroups); // printGroups(groups, numGroups); // // Free allocated memory // for (int i = 0; i < numGroups; i++) { // for (int j = 0; j < groups[i].numMembers; j++) { // free(groups[i].members[j].name); // } // free(groups[i].members); // } // free(groups); // return 0; // } int main(){ // makeHappiness("Birthday!"); // calculateHappinessScore("Hello, World!"); // calculateHappinessScore("Sad"); // printf("Prime: %d\n",isPrime(12)); // printf("Power of 2: %d\n",isPowerOfTwo(13)); // char input[] = "13,89,53,45,67"; // printf("%d",findHappinestNumber(input)); char input[11] = "i love you"; maximizeHappiestScore(input); // printf("%d", findHappinestNumber("12,88,4,45,62")); // Member members[] = { // {"Alice", 5}, // {"Bob", 7}, // {"Charlie", 3}, // {"David", 8}, // {"Eve", 6}, // {"Frank", 4}, // {"Grace", 9}, // {"Henry", 2}, // }; // int standardHappinessLevel = 12; // Group* groups = splitGroups(members, 8, standardHappinessLevel); // for (int i = 0; i < 3; i++) { // printf("Group %d (Happiness level: %d): ", i + 1, groups[i].happinessLevel); // for (int j = 0; j < groups[i].numMembers; j++) { // printf("%s ", groups[i].members[j].name); // } // printf("\n"); // } // free(groups); return 0; } // Group 1 (Happiness level: 12): Happy Charlie Happy Grace // Group 2 (Happiness level: 12): Happy David Happy Frank // Group 3 (Happiness level: 12): Happy Alice Happy Bob
Editor is loading...
Leave a Comment