问题 : base64解密

问题 : base64解密

时间限制: 1 Sec  内存限制: 128 MB
提交: 3  解决: 3
[提交][状态]

题目描述


Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。

为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。

如对字符’0’进行Base64加密,则是如下步骤:

字符’0’的二进制为00110000,前六位拿出来,前面补俩个0则是0001100,对应表得字符M。后面不足6位,只有俩位0,拿出来,前面补6个0,则是00000000,对应表得字符A。

由于还有2个6位的字节没显示,则用俩个=字符补充

那么字符0的Base64编码为MA==

现在蛋蛋给了你一段加密后的Base64密文,他说题意隐藏在密文里面,如果你知道了题意,就肯定可以做出本题。密文如下:

d2hhdCBpcyB0aGUgcmVtYWluZGVyIHdoZW4gdGhlIG51bWJlciBpcyBkaXZpZGVkIGJ5IDMwMDg/


输入

第一行一个整数t,代表有t组数据,每组数据输入一个整数x,0<=x<=2^31-1

输出

输出一个整数x,x为答案

样例输入

3
0
1
2016

样例输出

0
1
2016

提示

这个是题意解码,大概意思是对3008取余。

在if那里卡了很长时间。

#include<stdio.h>
int a[100][7],s[1010];
int main()
{
	char n;
	long long t,i,j,k,sum=0,ans;
	for(i=0;i<76;i++)
	{
		scanf("%c",&n);
		j=5;
		if(n>='a'&&n<='z')
			n-=71;	
		else if(n>='A'&&n<='Z')            //一定要加else!!!!
			n-=65;
		else if(n>='0'&&n<='9')             //一定要加else!!!!
			n+=4;
		else if(n=='+')                     //一定要加else!!!!
			n=62;
		else if(n=='/')                     //一定要加else!!!!
			n=63;
		while(n)
		{
			a[i][j]=n%2;
			n/=2;
			j--;
		}
	}
	k=0;
	
		ans=0;sum=0;
		for(i=0;i<76;i++)
		{
			for(j=0;j<6;j++)
			{
				ans=ans*2+a[i][j];
				sum++;
				if(sum==8)
				{
					sum=0;
					printf("%c",ans);
					ans=0;
				}
			}
		}
	return 0;
}

#include<stdio.h>
int main()
{
	int t,x;
	while(scanf("%d",&t)!=EOF)
	{
		while(t--)
		{
			scanf("%d",&x);
			printf("%d\n",x%3008);
		}
	}
	return 0;
}





posted @ 2018-04-19 21:23  宿星  阅读(206)  评论(0编辑  收藏  举报