#include <stdio.h> #include <stdlib.h> #include <math.h> #include <memory.h> #define LENGTH 10 /* * 取得不大于num的d的n次方的最大倍数 */ int GetCoefficient(int num, int d, int n){ int i = 0; for(i=1;;++i){ int x = (int)pow(d, n)*i; if(num < x) break; } return i-1; } char* to26(int n, int d){ char *result = NULL; int max = 0; int i = 0; int tmp = 0; int coefficient = 0; result = (char*)malloc(sizeof(char)*LENGTH); if(result == NULL) return NULL; memset(result, 0, sizeof(char)*LENGTH); /* * 获得不大于n的d的最大次方 */ while(n >= pow(d, max)){ max++; } tmp = n; /* * 循环取得所有次方的系数 */ for(i=max-1;i>=0;--i){ coefficient = GetCoefficient(tmp, d, i); *(result+max-1-i) =(char)(coefficient + 'a'); tmp -= coefficient*(int)pow(d,i); } if(max == 0) *result = 'a'; return result; } char *quicklyTo26(int n ,int d){ char *result = NULL; char reverse[LENGTH] = {0}; int count = 0; int i=0; result = (char*)malloc(sizeof(char)*LENGTH); if(result == NULL) return NULL; memset(result, 0, sizeof(char)*LENGTH); while(n >0){ *(result+count++) =(char)(n%d + 'a'); n = n/d; } if(count == 0){ *result = 'a'; }else{ strncpy(reverse, result, count); for(i=0;i<count;++i){ *(result+i) = reverse[count-1-i]; } } return result; } int main(){ char *result1 = NULL; char *result2 = NULL; int num = 0; int d = 26; while(1){ scanf("%d", &num); result1 = to26(num, d); result2 = quicklyTo26(num, d); if(result1 != NULL && result2 != NULL){ printf("Just Stupid: %s/n", result1); printf("A little improvement: %s/n", result2); } /* * 释放to26(int n, int d)开辟的内存 * 释放quicklyTo26(int n, int d)开辟的内存 */ free(result1); free(result2); } } 输入: 1544578931(5*26^6 + 26 +25) 输出:('a'对应数字0,'z'对应25) faaaabz