鱼C论坛

 找回密码
 立即注册
查看: 5128|回复: 17

题目40:找出这个无理数的小数部分的第n位

[复制链接]
发表于 2020-8-10 17:06:46 | 显示全部楼层
210

Process returned 0 (0x0)   execution time : 0.034 s
Press any key to continue.
参考了6#的解法,先确定每个位数所在的自然数区间,再求出偏移量,取余可以确定具体取那一位
位数和通项公式

                               
登录/注册后可看大图

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. using namespace std;

  5. const int dgt[] = {0,9,189,2889,38889,488889,5888889};//0为占位符
  6. const int M = 1000000;

  7. int extract(int x,int digit){
  8.   vector<int> v;
  9.   while(x){
  10.     v.push_back(x % 10);
  11.     x /= 10;
  12.   }
  13.   int n = v.size();
  14.   return v[n - 1 - digit];
  15. }

  16. int main(){
  17.   int ans = 1;

  18.   for (int i = 10;i <= M;i*=10){
  19.     int cur_dgt;
  20.     for (int j = 1;j < 6;j++)
  21.       if (i > dgt[j] && i < dgt[j+1]) {cur_dgt = j+1; break;}//落在哪一区间
  22.     int t = i - dgt[cur_dgt-1] - 1;
  23.     int cnt = t / cur_dgt;//偏移了cnt个数
  24.     int resd = t % cur_dgt;//取该数的第几位
  25.     int tar = i/10 + cnt;//目标数
  26.     //printf("%d %d %d %d %d\n",t,cur_dgt,cnt,tar,resd);
  27.     ans *= extract(tar,resd);

  28.   }
  29.   cout << ans << endl;
  30.   return 0;
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-9 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表