1194:ARMインスタント・アドレス

3995 ワード

1194 ARMインスタント・アドレス・リンク
Description
ARMプロセッサの即時数アドレス方式では、即時数は8ビットの符号なし定数である(0以上0以下0 xff以下)は、まず32ビットに拡張し、次に偶数ビットを右シフトして得られるので、0 x 101,0 x 102,0 xFF 1,0 xFF 04,0 x 8000007 Fなどは無効な即時数であり、0 xFF,0 x 3 FC,0 xC 00003 F,0 x 104,0 xFF 0,0 xFF 00,0 xf 00000 fなどは有効な即時数である.現在、32ビットの正の整数を与え、この数が有効な即時数であるか否かを判断してください.(0 x 12345678サイクル右シフト4ビットは0 x 81234567になります.)
Input
正の整数T(T<=1000000)は、T組の試験データが各組の試験データに32ビットの16進数n(0<=n<=0 xffffffff)を含むことを示す
Output
共にT行.各nについて、出力は1行を占め、nが有効な即時数であれば「YES」を出力し、そうでなければ「NO」を出力する.
Sample Input
30xff0xFF0xF0F
Sample Output
YESYESNO
HINT
試合の原題に間違いがあり、「0より大きい」は「0より大きい」であるべきだ.
この問題は試合中に分からなかったので、試合が終わった後、チームメイトが問題の考えを話して、何が起こっているのか分かりました.まず、この問題の考えは32位の16進数を32位の2進数にすればいいです.
1:化された32ビットのバイナリは32ビットのchar型配列で格納される
2:偶数ビットを移動するたびに、二、四、六............32まで
3:移動するたびに偶数ビットを判断し、前の24ビットがゼロであることを判断するだけで、この数が合法であることを説明し、このときループを飛び出してYESを直接出力すればよい.ループが終了しても合法でない場合はNOを出力します
具体的な実装はコードの中でいくつかの解釈の解釈を見ることができます多くの場所がはっきりしていないので、私にコードがOJで提出されたことを聞くことができます!
#include
#include
char c[16][5] = {{'1','1','1','1'}, {'1','1','1','0'}, {'1','1','0','1'}, {'1','1','0','0'},
		         {'1','0','1','1'}, {'1','0','1','0'}, {'1','0','0','1'}, {'1','0','0','0'},
				 {'0','1','1','1'}, {'0','1','1','0'}, {'0','1','0','1'}, {'0','1','0','0'},
				 {'0','0','1','1'}, {'0','0','1','0'}, {'0','0','0','1'}, {'0','0','0','0'}};
//                       				 
int count;				 
void f(char *b, int k)
{
	int j;
	for(j = 3; j >= 0; j--)
	{
		b[count--] = c[k][j];
	}
}				 
int main()
{
	int n, i, len, j, w, flag, k, z, ok, q;
	char a[40], b[40];
	scanf("%d", &n);
	while(n--)
	{
		scanf("%s", a);
		count = 31;
		len = strlen(a);
		for(i = len - 1; i >= 2; i--)//                       ,      
		//                
		{
			w = count;
			 if(a[i] == 'f' || a[i] == 'F') f( b, 0);
			 else if(a[i] == 'E' || a[i] == 'e') f( b, 1);
			 else if(a[i] == 'D' || a[i] == 'd') f( b, 2);
			 else if(a[i] == 'C' || a[i] == 'c') f( b, 3);
			 else if(a[i] == 'B' || a[i] == 'b') f( b, 4);
			 else if(a[i] == 'A' || a[i] == 'a') f( b, 5);	
			 else if(a[i] == '9') f( b, 6); 	 	 	
			 else if(a[i] == '8') f( b, 7);
			 else if(a[i] == '7') f( b, 8);
			 else if(a[i] == '6') f( b, 9);
			 else if(a[i] == '5') f( b, 10);
			 else if(a[i] == '4') f( b, 11);
			 else if(a[i] == '3') f( b, 12);
			 else if(a[i] == '2') f( b, 13);
		     else if(a[i] == '1') f( b, 14);
			 else if(a[i] == '0') f( b, 15);	 		 	 	 	 	 	 	 	
		}
	    for(i = 0; i<= count; i++)//     32        32 ,     
	    {
	    	b[i] = '0';
	    }
	    if(count >= 23)
	    {
	    	printf("YES
"); ok = 1; continue; } for(i = 2; i <= 32; i = i + 2)// { for(j = 1; j <= i; j++) // { q = b[31]; for(k = 30; k >= 0; k--)// { b[k + 1] = b[k]; } b[0] = q; } ok = 1; for(z = 0; z < 24; z++) { if(b[z] != '0') ok = 0; } if( 1 == ok ) { printf("YES
"); break; } } if(0 == ok) printf("NO
"); } return 0; }