|
发表于 2020-8-10 17:06:46
|
显示全部楼层
210
Process returned 0 (0x0) execution time : 0.034 s
Press any key to continue.
参考了6#的解法,先确定每个位数所在的自然数区间,再求出偏移量,取余可以确定具体取那一位
位数和通项公式
- #include<iostream>
- #include<cstdio>
- #include<vector>
- using namespace std;
- const int dgt[] = {0,9,189,2889,38889,488889,5888889};//0为占位符
- const int M = 1000000;
- int extract(int x,int digit){
- vector<int> v;
- while(x){
- v.push_back(x % 10);
- x /= 10;
- }
- int n = v.size();
- return v[n - 1 - digit];
- }
- int main(){
- int ans = 1;
- for (int i = 10;i <= M;i*=10){
- int cur_dgt;
- for (int j = 1;j < 6;j++)
- if (i > dgt[j] && i < dgt[j+1]) {cur_dgt = j+1; break;}//落在哪一区间
- int t = i - dgt[cur_dgt-1] - 1;
- int cnt = t / cur_dgt;//偏移了cnt个数
- int resd = t % cur_dgt;//取该数的第几位
- int tar = i/10 + cnt;//目标数
- //printf("%d %d %d %d %d\n",t,cur_dgt,cnt,tar,resd);
- ans *= extract(tar,resd);
- }
- cout << ans << endl;
- return 0;
- }
复制代码 |
|