A simple problem HDU-2522 【数学技巧】

来源:互联网 发布:选择 net java 编辑:程序博客网 时间:2024/05/17 22:38

题意:输出1/n,如果是循环的,那么输出第一个循环节

思路: 技巧:如果余数重复出现,那么该数字就是一个循环节的末端。

数据分析:(1<=|n|<=10^5) 注意到题目故意加了绝对值,所以要判断一下n的正负。

#include <bits/stdc++.h>using namespace std;bool vis[200000]; // 标记数组int main(void){    int t;    cin >>t;    while(t--)    {        memset(vis,false,sizeof(vis));        int n;        cin >> n;        if(n<0)        {            printf("-");            n=-n;        }        if(n==1) //如果是1要进行特判定,若进入else里跑1,那么输出会是0.1。else里输出的是小于1的情况。        {            printf("1\n");            continue;        }        else        {            printf("0.");            vis[0]=true;//vis[0]=true的原因是为了不多输出0!            int m=1;// 至于为什么是m=1应该是 模拟除法而已。            while(vis[m]==false)            {                vis[m]=true;                m*=10;                printf("%d",m/n);                m%=n;            }        }        puts("");    }    return 0;}

这里写图片描述

原创粉丝点击