# 识别字符

> 发布于：2020-10-17 | 分类：刷题 | 原文：https://www.imbailey.cn/post/identify-characters-repeating-decimals-algorithm

【题目描述】

数学课上，楠楠学习了一个新的知识。

两数相除，如果得不到整数商，会有两种情况：一种是得到有限小数，另一种是得到无限小数。从小数点后某一位开始依次不断地重复出现前一个或一节数字的十进制无限小数，叫做循环小数，如2.9666..., (在数学中它读作“二点九六，六循环” ）， 定义循环小数的缩写法是将第一个循环节以后的数字全部略去，并将第一个循环节首末用括号括起来。

例如：

2.966666... 缩写为 2.9(6)

35.232323…缩写为 35.(23)

楠楠发现，根据循环小数的特征，很快能算出这个循环小数中小数点后第n位的数字，你能吗？

**【输入】**

共2行。第一行，包含一个整数n(n≤100000)，表示求小数点后的第n位。第二行，一个字符串，用缩写法表示的一个循环小数。

**【输出】**

       一行，包含一个整数，表示循环小数中小数点后第n位的数字。

For example:

Input

Result

10  
352.19(7)

7

## 答案

```
#include <iostream>

using namespace std;

int main()
{
    char a[100];
    int weishu,buxunhuan,xunhuan,m,jieguo1;
    cin >> weishu ; //输入1

    int n=0;
    cin >> a[0];
    while((a[++n]=getchar())!='\n');    //输入2

    int i,left,right,dian;


    for(i=n;i>0;i--)
    {
        if(a[i] == ')')
           right = i;
        if(a[i] == '(')
            left = i;
        if(a[i] == '.')
            dian = i;

    }
    buxunhuan = left - dian -1;
    xunhuan = right - left -1;
    if(weishu <= buxunhuan)
    {
        jieguo1 = weishu + dian;
        cout << a[jieguo1];
    }
    else
    {

        m = (weishu - buxunhuan)%xunhuan;
        if(m==0)
        {
            cout << a[left + xunhuan];
        }
        else
        {
            cout << a[m+left];
        }

    }


    return 0;
}
```
