您的位置:首页 > 其它

POJ 1019 数学题

2014-12-13 23:20 169 查看
#include <cstdio>
#include <cstring>

using namespace std;

int sum[20];
//sum[i]表示尾数为i的组最大可达到的数字个数
void init()
{
sum[0] = 0;
sum[1] = 9;
sum[2] = 189;
sum[3] = 2889;
sum[4] = 38889;
sum[5] = 488889;
sum[6] = 5888889;
}

//找到最后对应的组数属于的范围是在多少位的整数上,返回整数的位数
int get_bit(int &n)
{
for(int i = 0 ; i<6 ; i++){
if(n > sum[i] && n <= sum[i+1])
{
n -= sum[i];
return i+1;
}
}
return -1;
}
//返回g这个组中对应的数字的个数
int get_num_of_group(int g)
{
int t = 10;
int k = 1;
int ret = 0;
while(g >= t){
ret += t/10*9*k;
t *= 10;
k++;
}
ret += (g - t/10 + 1) * k;
return ret;
}

int main()
{
int T;
//cout<<get_num_of_group(100)<<endl;
scanf("%d" , &T);
init();
while(T--){
int n;
scanf("%d" , &n);
int group = 1;
int cnt = 1;
//group表示第几组,cnt表示对应组中含有的数字的个数
while(1){
if(n <= cnt) break;
n -= cnt;
group++;
cnt = get_num_of_group(group);
}
//cout<<"group"<<group<<" "<<n<<endl;
int t = get_bit(n);
//cout<<"t  " <<t<<endl;
int st;
//st表示从几位数字开始找起,如st = 10,表示最后这个点属于10-99范围
if(t < 0) st = 1 , t = 1;
else
{
st = 1;
for(int i=1 ; i<=t-1 ; i++)
st *= 10;

}
//cout<<"st  " <<st<<endl;
while(n > t){
n -= t;
st++;
}
n = t + 1 - n;
int ans = st%10;
for(int i=1 ; i<=n ; i++){
ans = st%10;
st /= 10;
}
printf("%d\n" , ans);
}
// cout<<9 + 2*90 + 3*900<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: