void printStrings(int* num, char* res, int pos) { int i; if(pos == LEN) { printf("%s\n", res); return; } else { if (num[pos] == 7 || num[pos] == 9) { for(i=1; i<=4; i++) { res[pos] = getCharKey(num[pos], i); printStrings(num, res, pos+1); if(num[pos] == 0 || num[pos] == 1) return; } } else { for(i=1; i<=3; i++) { res[pos] = getCharKey(num[pos], i); printStrings(num, res, pos+1); if(num[pos] == 0 || num[pos] == 1) return; } } } }
void iterativeFind(int *sequence, int length, char *string) { int i; for (i=0; i<length; i++) { if (sequence[i] >= 2) string[i] = getCharKey(sequence[i], 1); else string[i] = '0' + sequence[i]; } while(1) { printf("%s\n", string); for (i=0; i<length; i++) { if (string[i] == getCharKey(sequence[i], 3)) { string[i] = getCharKey(sequence[i], 1); } else if (string[i] == getCharKey(sequence[i], 2)) { string[i] = getCharKey(sequence[i], 3); break; } else if (string[i] == getCharKey(sequence[i], 1)) { string[i] = getCharKey(sequence[i], 2); break; } } if (i == length) return; } }
// Non-recursion based void printTelephoneWords2(int phoneNum[]){ char result[PHONE_NUMBER_LENGTH + 1]; int i; // Initialize the final result for(i=0; i<PHONE_NUMBER_LENGTH; i++){ result[i] = getCharKey(phoneNum[i], 1); } // Tack on the NUL character at the end result[PHONE_NUMBER_LENGTH] = '\0'; // Main loop begins while(1){ printf("%s\n", result); // Start at the end and try to increment from right to left for(i=PHONE_NUMBER_LENGTH-1; i>=-1; i--){ // Done, because you tried to carry the leftmost digit if(i == -1){ return; } // Otherwise, we're not done and must continue if(result[i]==getCharKey(phoneNum[i], 3) || phoneNum[i]==0 || phoneNum[i]==1){ // Reset current digit and continue! // Because carry movement involves 2 steps // 1) Reset current digit // 2) Increment next digit result[i] = getCharKey(phoneNum[i], 1); } else if(result[i] == getCharKey(phoneNum[i], 1)){ // Increment and break to print result[i] = getCharKey(phoneNum[i], 2); break; } else if(result[i] == getCharKey(phoneNum[i], 2)){ // Increment and break to print result[i] = getCharKey(phoneNum[i], 3); break; } } } }
void recursiveFind(int *sequence, int length, int counter, char *string) { int i; if (counter == length) { printf("%s\n", string); return; } if (sequence[counter] >= 2) { for (i=1; i<=3; i++) { string[counter] = getCharKey(sequence[counter], i); recursiveFind(sequence, length, counter+1, string); } } else { string[counter] = '0' + sequence[counter]; recursiveFind(sequence, length, counter+1, string); } }
void doPrintTelephoneWords(int phoneNum[], int curDigit, char result[]){ int i; // Base case if(curDigit == PHONE_NUMBER_LENGTH){ printf("%s\n", result); return; } for(i=1; i<=3; i++){ result[curDigit] = getCharKey(phoneNum[curDigit], i); doPrintTelephoneWords(phoneNum, curDigit+1, result); // Special case, to prevent from printing any word 3 times if(phoneNum[curDigit]==0 || phoneNum[curDigit]==1){ return; } } }
void _printwords(char * number, char * wptr) { if (!(*wptr)) { printf("%s\n", number); return; } int key = getCharInt(*wptr); if (key > 1) { for (int i = 0; i < 3; ++i) { char r = getCharKey(key,i); *wptr = r; _printwords(number,wptr+1); } //because the recursion traverses the entire depth //of the phone number, then iterates, then does the *same* //thing... so it should be in the *same* state. *wptr = key+0x30; } else { _printwords(number,wptr+1); } }
/** * Crypte les statistiques de l'unité pour * la sauvegarde * @param unitSaved Unité sauvegardée */ void crypt(unit * unitSaved){ long size = (strlen(key) * 15) + key[0] - key[1] / key[2]; // Récupère la taille du nom de l'unité int pos = 0; char * dynamicKey; dynamicKey = getKey(unitSaved->name); // Récupère une clé dynamique unitSaved->name *= size; unitSaved->stat.ARMOR *= (float)(-size * getCharKey(dynamicKey, &pos)); unitSaved->stat.POWER *= -size * getCharKey(dynamicKey, &pos); unitSaved->stat.HP *= -size * getCharKey(dynamicKey, &pos); unitSaved->stat.RECOVERY *= -size * getCharKey(dynamicKey, &pos); unitSaved->stat.MOVE_RANGE *= -size * getCharKey(dynamicKey, &pos); unitSaved->stat.BLOCK[0] *= (float)(-size * getCharKey(dynamicKey, &pos)); unitSaved->stat.BLOCK[1] *= (float)(-size * getCharKey(dynamicKey, &pos)); unitSaved->stat.BLOCK[2] *= (float)(-size * getCharKey(dynamicKey, &pos)); unitSaved->unitColor *= -size * getCharKey(dynamicKey, &pos); unitSaved->noPlayer *= -size * getCharKey(dynamicKey, &pos); for(int k = 0; k <NB_MAX_EFFECT; k++) { // Effets de status liés à l'unité actuelle unitSaved->effect[k] /= -size - getCharKey(dynamicKey, &pos); } free(dynamicKey); // Libère la mémoire de la clé }