http://www.acmicpc.sdnu.edu.cn/problem/show/1161
每一个字串比前面的字串多一个数注意是一个数,而不是一个字符,多出几个字符需要特殊判断和处理,代码读起来还是比较简单的,但是不小心做起来就全是坑,不算思考的时间,调试代码就花了1个半小时。
代码还有很多待优化的地方,比如输入输出的scanf printf 。代码中加了不少调试的代码,读者可以删了,增加可读性。
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
void chuli(int i)
{
if (i<10)
{
cout<<i;
}else if (i==10)
{
/* code */
cout<<"A";
}else if (i==11)
{
/* code */
cout<<"B";
}else if (i==12)
{
/* code */
cout<<"C";
}else if (i==13)
{
/* code */
cout<<"D";
}else if (i==14)
{
/* code */
cout<<"E";
}else if (i==15)
{
/* code */
cout<<"F";
}
}
int a[45000]={0};
int b[45000]={0};
int main()
{
a[1]=1;
int temp=1;
b[1]=1;
for (int i = 2; i < 45000; ++i)
{
/* code */
if (i<=15)
{
/* code */
temp+=1;
a[i]=a[i-1]+temp;
}else if (i<=(16*16-1))
{
/* code */
temp+=2;
a[i]=a[i-1]+temp;
}else if (i<=(16*16*16-1))
{
/* code */
temp+=3;
a[i]=a[i-1]+temp;
}else if (i<=(16*16*16*16-1))
{
/* code */
temp+=4;
a[i]=a[i-1]+temp;
}else if (i<=(16*16*16*16*16-1))
{
/* code */
temp+=5;
a[i]=a[i-1]+temp;
}else if (i<=(16*16*16*16*16*16-1))
{
/* code */
temp+=6;
a[i]=a[i-1]+temp;
}else if (i<=(16*16*16*16*16*16*16-1))
{
/* code */
temp+=7;
a[i]=a[i-1]+temp;
}else
{
/* code */
temp+=8;
a[i]=a[i-1]+temp;
}
b[i]=temp;
}
// cout<<a[256]<<endl;
// cout<<b[255]<<endl;
// cout<<b[256]<<endl;
while(cin>>temp)
{
for (int i = 0; i < 45000; ++i)
{
/* code */
if (temp<=a[i])
{
/* code */
temp-=a[i-1];
break;
}
}
// if (temp==0)
// {
// temp=1;
// }
// cout<<"1--"<<temp<<endl;
int weizhi=0;
for (int i = 0; i < 45000; ++i)
{
/* code */
if (b[i]==temp)
{
/* code */
// cout<<"2--"<<b[i]<<"--"<<i<<endl;
temp=i;
break;
}else if (b[i]>temp)
{
/* code */
// cout<<"2--"<<b[i]<<"--"<<i;
weizhi=b[i]-temp;
// cout<<"--"<<weizhi<<endl;
temp=i;
break;
}
}
// cout<<"4--";
for (int i = 0; i < weizhi; ++i)
{
/* code */
// cout<<temp%16<<" ";
temp=temp/16;
}
// cout<<endl;
// cout<<"3--"<<temp<<endl;
chuli(temp%16);
cout<<endl;
}
return 0;
}