ピーピー原稿番号変換
43284 ワード
文書ディレクトリファイル呼び出し型 ダイレクトオープン型 3-27 Upd:コードを少し最適化しましたが、高速べき乗は必要ありません.元のコードは撤去された.
——
先日、B駅が公式に原稿番号の表示形式を変更し、多くの人が過去のav号を懐かしんでいたので、今日はC++コードを提供してav号とBV号を変換しました.
アルゴリズムは大物から来た.
コードにはアルゴリズムに関する注釈はありませんが、アルゴリズムを見てからコードを理解するのはあまり問題ないと思います.
ローカルのファイル名は
ファイルダウンロードアドレス
上記のコードには2つの形式のプログラムが含まれています.一部の人(私自身)が読めないのを防ぐために、次は分割しました.
ファイル呼び出しタイプ
ダイレクトオープンタイプ
——
先日、B駅が公式に原稿番号の表示形式を変更し、多くの人が過去のav号を懐かしんでいたので、今日はC++コードを提供してav号とBV号を変換しました.
アルゴリズムは大物から来た.
コードにはアルゴリズムに関する注釈はありませんが、アルゴリズムを見てからコードを理解するのはあまり問題ないと思います.
ローカルのファイル名は
convert.cpp
. ファイルダウンロードアドレス
#include
#include
typedef long long LL;
char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
int tr[1005];
int pos[] = {11, 10, 3, 8, 4, 6};
#define XORNUM 177451812
#define ADDNUM 8728348608LL
#define MODE 0//0:file_call_mode, 1:input_mode
LL decode(char* BVnumber) {
LL r = 0, Pow58 = 1;
for(int i = 0; i < 6; ++i) {
r += tr[(int)BVnumber[pos[i]]];
Pow58 *= 58;
}
return (r - ADDNUM) ^ XORNUM;
}
char BVtemp[15] = "BV1 4 1 7 ";
char* encode(LL avnumber) {
avnumber = (avnumber ^ XORNUM) + ADDNUM;
static char BVnumber[15] = "BV1 4 1 7 ";
LL Pow58 = 1;
for(int i = 0; i < 6; ++i) {
BVnumber[pos[i]] = table[avnumber / Pow58 % 58];
Pow58 *= 58;
}
return BVnumber;
}
bool checkBV(char* BVnumber) {
for(int i = 0; i < 12; i++)
if(BVtemp[i] != 32 && BVtemp[i] != BVnumber[i])
return false;
return true;
}
#if MODE == 0
int main(int argc, char** argv) {
if(argc == 1) {
puts("EXAMPLE1: \"convert av170001\" (without quotes)");
puts("EXAMPLE2: \"convert BV17x411w7KC\" (without quotes)");
return 0;
}
for(int id = 1; id < argc; id++) {
#else
int main() {
#endif
for(int i = 0; i < 58; ++i) tr[(int)table[i]] = i;
LL avnumber;
#if MODE == 0
char *number = argv[id];
#else
char number[15];
while(scanf("%s", number) != EOF) {
#endif
if(number[0] == 'a' && number[1] == 'v') {
sscanf(number, "av%lld", &avnumber);
printf("%s is converted to %s
", number, encode(avnumber));
} else if(number[0] == 'B' && number[1] == 'V') {
if(checkBV(number)) printf("%s is converted to av%lld
", number, decode(number));
else puts("Please check the BV number you entered.");
}
}
return 0;
}
上記のコードには2つの形式のプログラムが含まれています.一部の人(私自身)が読めないのを防ぐために、次は分割しました.
ファイル呼び出しタイプ
#include
#include
typedef long long LL;
char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
int tr[1005];
int pos[] = {11, 10, 3, 8, 4, 6};
#define XORNUM 177451812
#define ADDNUM 8728348608LL
LL decode(char* BVnumber) {
LL r = 0, Pow58 = 1;
for(int i = 0; i < 6; ++i) {
r += tr[(int)BVnumber[pos[i]]];
Pow58 *= 58;
}
return (r - ADDNUM) ^ XORNUM;
}
char BVtemp[15] = "BV1 4 1 7 ";
char* encode(LL avnumber) {
avnumber = (avnumber ^ XORNUM) + ADDNUM;
static char BVnumber[15] = "BV1 4 1 7 ";
LL Pow58 = 1;
for(int i = 0; i < 6; ++i) {
BVnumber[pos[i]] = table[avnumber / Pow58 % 58];
Pow58 *= 58;
}
return BVnumber;
}
bool checkBV(char* BVnumber) {
for(int i = 0; i < 12; i++)
if(BVtemp[i] != 32 && BVtemp[i] != BVnumber[i])
return false;
return true;
}
int main(int argc, char** argv) {
if(argc == 1) {
puts("EXAMPLE1: \"convert av170001\" (without quotes)");
puts("EXAMPLE2: \"convert BV17x411w7KC\" (without quotes)");
return 0;
}
for(int id = 1; id < argc; id++) {
for(int i = 0; i < 58; ++i) tr[(int)table[i]] = i;
LL avnumber;
char *number = argv[id];
if(number[0] == 'a' && number[1] == 'v') {
sscanf(number, "av%lld", &avnumber);
printf("%s is converted to %s
", number, encode(avnumber));
} else if(number[0] == 'B' && number[1] == 'V') {
if(checkBV(number)) printf("%s is converted to av%lld
", number, decode(number));
else puts("Please check the BV number you entered.");
}
}
return 0;
}
ダイレクトオープンタイプ
#include
#include
typedef long long LL;
char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
int tr[1005];
int pos[] = {11, 10, 3, 8, 4, 6};
#define XORNUM 177451812
#define ADDNUM 8728348608LL
LL decode(char* BVnumber) {
LL r = 0, Pow58 = 1;
for(int i = 0; i < 6; ++i) {
r += tr[(int)BVnumber[pos[i]]];
Pow58 *= 58;
}
return (r - ADDNUM) ^ XORNUM;
}
char BVtemp[15] = "BV1 4 1 7 ";
char* encode(LL avnumber) {
avnumber = (avnumber ^ XORNUM) + ADDNUM;
static char BVnumber[15] = "BV1 4 1 7 ";
LL Pow58 = 1;
for(int i = 0; i < 6; ++i) {
BVnumber[pos[i]] = table[avnumber / Pow58 % 58];
Pow58 *= 58;
}
return BVnumber;
}
bool checkBV(char* BVnumber) {
for(int i = 0; i < 12; i++)
if(BVtemp[i] != 32 && BVtemp[i] != BVnumber[i])
return false;
return true;
}
int main() {
for(int i = 0; i < 58; ++i) tr[(int)table[i]] = i;
LL avnumber;
char number[15];
while(scanf("%s", number) != EOF) {
if(number[0] == 'a' && number[1] == 'v') {
sscanf(number, "av%lld", &avnumber);
printf("%s is converted to %s
", number, encode(avnumber));
} else if(number[0] == 'B' && number[1] == 'V') {
if(checkBV(number)) printf("%s is converted to av%lld
", number, decode(number));
else puts("Please check the BV number you entered.");
}
}
return 0;
}