1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
| #include<stdio.h> #include<stdlib.h> char zidian[] = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; static int e=98;
long long int cifang(int a, int n) { if (n == 1) { return (long long int)1; } return (long long int)a * cifang(a, n - 1); } long long int zhuanhua10(char* a, int n) { if (n == 1) { return (long long int) * a; } return (long long int)((*(a + n - 1)) + (zhuanhua10(a, n - 1) * 256)); } long long int zhuanhua58(long long int n, int* p, int* flag) { if (*flag == 0) { *p = *p + 1; } if (n % 58 == 0) { if (*flag == 0) { *p = *p - 1; } return 0; } else return n % 58 + zhuanhua58((long long int)(n - n % 58) / 58, p, flag) * 100; } void base58(char* jiami, int n, int* p, char* jiemi, int* flag) { int a, b; long long int c; c = zhuanhua58(zhuanhua10(jiami, n), p, flag); for (a = *p, b = 0; a > 0; a--, b++) { jiemi[b] = zidian[(c / cifang(100, a)) - (c / cifang(100, a + 1)) * 100];
} jiemi[b + 1] = '\0';
}
long long int jiaoyan(char a) { long long int b; for(b=0;1;b++) { if(a==zidian[b]) { return b; } } } long long int huifu10(char *jiami,long long int n) { if(n==-1) {
return 0; } return jiaoyan(jiami[n])+huifu10(jiami,n-1)*58; } long long int huifu256(long long int n) { if(n==0) { return 0; } return n%256+huifu256((n-n%256)/256)*1000; } void base58jiemi(char *jiemi,long long int n) { if(n%1000==0) { e++; return; } jiemi[e]=n%1000; e--; base58jiemi(jiemi,n/1000); } int main() { printf("请选择加密/解密:0/1"); int n; scanf("%d",&n); switch(n) { case 0:{ printf("请输入字符数"); scanf("%d", &n); getchar(); char* jiami = (char*)calloc(n+2, sizeof(char)); fgets(jiami, n+2, stdin); int jishu = 0; int fla = 0; int* flag = &fla; int* pjishu = &jishu; for (n = 0; 1; n++) { if (jiami[n] == '\n') { jiami[n] = '\0'; break; } } zhuanhua58(zhuanhua10(jiami, n), pjishu, flag); *flag = 1; char* jiemi = (char*)calloc(*pjishu + 1, sizeof(char)); base58(jiami, n, pjishu, jiemi, flag); puts(jiemi); };break; case 1: { printf("请输入字符数"); scanf("%d", &n); getchar(); char* jiami = (char*)calloc(n+2, sizeof(char)); fgets(jiami, n+2, stdin); for (n = 0; 1; n++) { if (jiami[n] == '\n') { jiami[n] = '\0'; break; } } char jiemi[100]="\0"; jiemi[99]='\0'; base58jiemi(jiemi,huifu256(huifu10(jiami,n-1))); puts(jiemi+e); };break; } return 0; }
|