UVa 213 信息编码!模拟!

背景:一次ac!!而且调试时间也短!!!!看来这个自定义函数,确实是一个好的方法!!构思又清晰,调试又明朗!

思路:一些单一的函数堆砌而成,每个函数有自己的功能。

学习:1.我是采用模拟手算二进制为十进制的方法,而小紫书上给出的方法似乎更简单:(这似乎透露除了字符串数转化普通数的方法)(普通二进制数,转化为十进制数就一位一位的拆分)

//assumpt that temp[] have n charnumbers
int decimal=0;
for(int i = 0;i < n;i++){
   decimal=decimal*2 +temp[i]-'0';
}
#include<stdio.h>
#include<math.h>
char list[248],temp[8],answer[10000];

char scan(void){
	int count=0;
	char a;
	while((a = getchar()) != EOF && a != '\n'){
		list[count++] = a;
	}
	return a;
}

void print(int x,int n){
  int y;
	if(n == 1) y=0;
	else if(n == 2) y=1+x;
	else if(n == 3) y=4+x;
	else if(n == 4) y=11+x;
	else if(n == 5) y=26+x;
	else if(n == 6) y=57+x;
	else if(n == 7) y=120+x;
	printf("%c",list[y]);
}

void get(int length){
	char a;
	int count=0;
	for(int i = 0;i < length;i++){
		if((a = getchar()) == '\n'){
			i--;
		}else{
			temp[count++] = a;
		}
	}
} 

int calculate(int n){
	int ans=0;
	for(int i = n-1,k = 0;i >= 0;i--,k++){
		ans+=(temp[i]-'0')*(int)pow(2.0,(double)k);
	}
	return ans;
}

bool make(void){
	get(3);
	if(temp[0] == '0' && temp[1] == '0' && temp[2] == '0'){
		printf("\n");
		return true;
	}
	int n=calculate(3);
	while(1){
		get(n);
		bool over = false;
		for(int i = 0;i < n;i++) if(temp[i] != '1') over =true;
		if(!over){//this segment
			break;
		}
		int a = calculate(n);
		print(a,n);
	}
	return false;
} 

int main(void){
    while(scan()!=EOF){
    	while(1) if(make()) break;
    	getchar();
    }
	  return 0;
} 
时间: 2024-11-05 02:29:15

UVa 213 信息编码!模拟!的相关文章

UVa 213 Message Decoding(World Finals1991,字符串)

 Message Decoding  Some message encoding schemes require that an encoded message be sent in two parts. The first part, called the header, contains the characters of the message. The second part contains a pattern that represents the message. You must

UVA 712(二叉树模拟)

L - S-Trees Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Appoint description:  System Crawler  (2014-04-01) Description  S-Trees  A Strange Tree (S-tree) over the variable set  is a binary tree representing a B

UVa 213 信息解码 (模拟 &amp;&amp; 二进制)

题意 :对于下面这个字符串 0,00,01,10,000,001,010,011--. 首先是长度为1的串,然后是长度为2的串,以此类推.不存在全为1的串. 你的任务是编写一个程序.首先输入一个代码头(例如AB#TANCnrtXc),则上述序列的每个串依次对应编码头的每个字符.例如,0对应A,00对应B,01对应#-,0000对应c.接下来是编码文本(可能由多行组成,你应当把他们拼成一个长长的01串).编码文本由多个小节组成,每个小节的前3个数字代表小节中每个编码的长度,用二进制表示,然后是个字

UVa 213 Message Decoding (信息编码)

该题目作为放假回归正轨的第一道正式做的题目,被卡了好久,唉,怪我有颗太浪的心 解题思路: 1.把编码头用二维字符数组存储起来,a[x][y]存储对应的字符,x表示编码的长度,y表示编码的大小, 存储时注意y<2^x - 1的 2.由于编码文本可能是由多行组成,所以需要判断和跳过对换行符的处理,为方便处理,将编码文本视作字符处理 #include<iostream> #include<CString> #include<cmath> #include<stdl

UVA 246 - 10-20-30 (模拟+STL)

UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断): 1.头两张+尾一张和为10或20或30 2.头一张+尾两张和为10或20或30 3.尾三张和为10或20或30 就把这三张牌拿走,放到总牌堆底(这步要不断执行直到不再满足条件或牌堆没了) 如果有一个牌堆因为这个操作被取完了,那么以后将不在这个位置发牌. 如果最后7个牌堆都可以消掉,那么赢,总牌堆用完,那么输,否则平(即不断循环)

UVa 11988 (数组模拟链表) Broken Keyboard (a.k.a. Beiju Text)

题意: 模拟一个文本编辑器,可以输入字母数字下划线,如果遇到'['则认为是Home键,如果是']'则认作End键. 问最终屏幕上显示的结果是什么字符串. 分析: 如果在数组用大量的移动字符必然很耗时.所以next数组表示显示屏中s[i]右边的字符编号,变量cur模拟光标,即当前光标位于s[cur]的右边. 变量last记录显示屏最后一个字符的下标. 我理解的连接的情况应该是这样子的: 1 //#define LOCAL 2 #include <cstdio> 3 #include <cs

UVa 213,World Finals 1991,信息解码

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=149 紫书P83 解题报告: 思路很巧.每个字符这样记录,由于同一个值可能有好几种对应,比如0,00,000,这样用一个二维数组code[len][v] 记录字符. 二进制再熟悉一遍.扫一遍长度为len的二进制所有数值.for(int v = 0;v<(1<<le

UVa 514 Rails(模拟栈)

题意  n辆火车按顺序依次进站  判断给定的出战顺序是否可能 用数组模拟模拟栈代表车站  车依次进站  每当栈顶火车序号与当前要出站的b[cur] 相等时 就让栈顶元素出栈  即top-- #include<cstdio> #include<cstring> using namespace std; const int N = 2000; int b[N], c[N]; int main() { int l, cur, top; while(scanf("%d"

UVa 1589 Xiangqi(模拟 HDU4121)

题意  给你一个黑方被将军的象棋残局  判断红方是否已经把黑方将死 模拟题  注意细节就行了  看黑方的将是否四个方向都不能走 #include<cstdio> #include<cstring> using namespace std; const int N = 12; char brd[N][N]; int dx[] = { -1, 1, 0, 0}, dy[] = {0, 0, -1, 1}; int hx[] = { -2, -1, -2, -1, 1, 2, 1, 2}