程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 128 - Software CRC

UVA 128 - Software CRC

編輯:C++入門知識

給出一串字符串,求其循環冗余校驗碼.

求法:把整個字符串看成一個整數m,第一個字符作為這個整數的最高字節,第二個字符作為次高字節,etc...

要求在這個整數最後加上兩個字節變成m2,使其整除34943.

解法:快速冪取模,粒度為一個字節.

#include 
#include 
using namespace std;
#define MOD 34943
char message[1025];

int mod_pow(int a, int b, int c){
	int res = 1, t = a;
	while(b){
		if(b & 1)res = res * t % c;
		t = t * t % c;
		b >>= 1;
	}
	return res % c;
}


int main(){
	while(gets(message)){
		if(message[0] == '#' && message[1] == 0)break;
		int ans = 0, len = strlen(message), shift = 2;
		for(int i = len - 1; i >= 0; --i){
				ans = (ans + message[i] * mod_pow(256, shift, MOD) % MOD) % MOD;
				shift++;
		}
		ans = (MOD - ans) % MOD;
		printf("%02X %02X\n", ans >> 8, ans & ((1 << 8) - 1));
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved