您的位置:首页 > 其它

Digit【2015 湘潭大学程序设计比赛(Internet)】

2015-04-27 10:23 267 查看
Click to view the problem

思路:这道题我就是直接算,给定的字符串是从1开始的,可以确定有9个一位数,90个两位数,900个三位数,9000个四位数…….so,计算一下所给的n包含的有几位数,并计算出最后一个数。具体步骤看代码。。。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
__int64 t, n, k;
__int64 sum, l;    //没用长整形会爆掉
__int64 x, pp, i;
int ans, a[10];
scanf("%I64d", &t);
while(t--)
{
scanf("%I64d", &n);
for(i = 9,k = 1; ; i = i * 10)
{
sum = i * k;
if(n <= sum) break;
k++;      //计算出数字位数
n -= sum;
}
if(n / k == 0)
x = i / 9;
else
x = (n/k) + i / 9 - 1;      //计算出第n位所在的那个数
if(n % k == 0) ans = x % 10;    //如果能整除,证明是数的最后一位
else     //将
{
pp = (n % k) - 1;   //所求的数字的位数
i = k - 1;
if(n % k != 0)
x++;
while(1)      //将x拆开存到数组
{
if(x == 0)
break;
a[i] = x % 10;
x /= 10;
i--;
}
ans = a[pp];
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: