ピーピー原稿番号変換

43284 ワード

文書ディレクトリ
  • ファイル呼び出し型
  • ダイレクトオープン型
  • 3-27 Upd:コードを少し最適化しましたが、高速べき乗は必要ありません.元のコードは撤去された.
    ——
    先日、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; }