| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请教,这代码过了3725却在这WA了,不知道哪的问题#include"iostream"
using namespace std;
__int64 table[20]; //保存10^i
__int64 m,k;
void init()
{
table[0]=1;
int i;
for(i=1;i<19;i++)
table[i]=table[i-1]*10;
table[19]=1;
table[19]=~(table[19]<<63);
}
__int64 getrank(__int64 v) //记算从10^i到v有多少个,(i)为v的位数-1
{
int i;
for(i=0;table[i]<=v;i++);
return v-table[i-1]+1;
}
int check(__int64 v) //检查是否是10^i,要特殊处理,因为10^i只能排在i+1位。
{
int i;
for(i=0;i<19;i++)
if(table[i]==v)
return i;
else
if(table[i]>v)
return -1;
return -1;
}
int main()
{
init();
while(EOF!=scanf("%I64d%I64d",&m,&k))
{
int temp=check(m);
if(temp>=0)
{
if(temp+1==k)
{
printf("%I64d\n",k);
}
else
{
puts("0");
}
continue;
}
__int64 r=0;
__int64 t=m;
while(t)
{
r+=getrank(t);
t/=10;
}
if(r==k)
{
printf("%I64d\n",m);
continue;
}
if(r>k)
{
puts("0");
continue;
}
k-=r;
t=m*10; //当k<r时,要增加n,每次增加一个位数,排在m前面的只有比m*10小的。
while(true)
{
r=getrank(t)-1;
if(r>=k)
break;
k-=r;
t*=10;
}
int i;
for(i=0;table[i]<=t;i++);
printf("%I64d\n",table[i-1]+k-1);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator