UVA 10706 - Number Sequence

              这个题数据挺大的,本来我想定义str[2147483647]然后把它跑出来存起来,读入数据a后直接输出str[a-1],但是数据太大了,所以先手算了一下一个大概的范围,

                                         9                       45

                                         99                     9045

                                         999                   1395495

                                         9999                189414495

                然后在每个小区间内再去求具体的数字。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int goal;
char str[500000],ss[50];
int n;
long long int num=0,t;
void solve1()
{
    int s=0,i=0;
    while(++i)
    {
        if(s+i>goal)
            break;
        s+=i;
    }
    i--;
    int a=goal-s;
    if(goal==s)
        cout<<i%10<<endl;
    else cout<<str[a-1]<<endl;
}
void solve2()
{
    goal-=45;
    int s=0,i=9;
    while(++i)
    {
        if(s+2*i-9>goal)
            break;
        s+=2*i-9;
    }
    i--;
    int a=goal-s;
    if(goal==s)
        cout<<i%10<<endl;
    else cout<<str[a-1]<<endl;
}
void solve3()
{
    goal=goal-9045;
    int s=0,i=99;
    while(++i)
    {
        if(s+3*i-108>goal)
            break;
        s+=3*i-108;
    }
    i--;
    int a=goal-s;
    if(goal==s)
        cout<<i%10<<endl;
    else cout<<str[a-1]<<endl;
}
void solve4()
{
    goal=goal-9045-1386450;
    int s=0,i=999;
    while(++i)
    {
        if(s+4*i-1107>goal)
            break;
        s+=4*i-1107;
    }i--;
    int a=goal-s;
    if(goal==s)
        cout<<i%10<<endl;
    else cout<<str[a-1]<<endl;
}
void solve5()
{
    goal=goal-189414495;
    long long int s=0,i=9999;
    while(++i)
    {
        if(s+5*i-11106>goal)
            break;
        s+=5*i-11106;
    }
    i--;
    long long int a=goal-s;
        //cout<<i<<"  "<<a<<"  "<<goal<<endl;
    if(goal==s)
        cout<<i%10<<endl;
    else cout<<str[a-1]<<endl;
}
int main()
{
    //freopen("in.txt","r",stdin);
    for(int j=1; j<=31270; j++)
    {
        n=0;
        int jj=j;
        while(jj/10)
        {
            ss[n++]=jj%10+'0';
            jj/=10;
        }
        ss[n++]=jj+'0';
        ss[n]='\0';
        for(int k=n-1; k>=0; k--)
            str[num++]=ss[k];
    }
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%d",&goal);
        if(goal<=45)
            solve1();
        else if(goal<=9000+45)
            solve2();
        else if(goal<=9000+45+1386450)
            solve3();
        else if(goal<=189414495)
            solve4();
        else
            solve5();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值