一个简单的数学题

来源:互联网 发布:斗鱼手游直播软件 编辑:程序博客网 时间:2024/04/28 15:04
一个简单的数学题

时间限制:3 Sec 内存限制:64 MiB special judge:No  

题目描述

zyc最近迷上了数学,一天,dj想出了一道数学题来难住他。算出1/n,但zyc一时答不上来希望大家能编程帮助他。

输入

第一行整数T,表示测试组数。后面T行,每行一个整数 n (1<=|n|<=10^5).

输出

输出1/n. (是循环小数的,只输出第一个循环节).

样例输入

复制
4237168

样例输出

复制
0.50.30.1428570.005952380

 1/n的小数部分循环特征

源于此网址:https://www.zybang.com/question/9eb1d3aa58400e172a37b1074d0c8c79.html

证明:任意自然数N在1/N后 得到有限小数 或者是无限循环小数且循环字节数小于N-1
例如:1/11=0.09090909. 循环部分是09,是2个字节,2小于11;
1/7=0.142857142857142857. 循环部分是142857,6位 小于7;
证明无论何时,1除以N这个循环字节总是小于N
       

代码

#include<stdio.h>
#include<string.h>
#define Max 100011       //如果直接将a【Max】换成a【100011】,则会导致“运行时错误”。

int a[Max];                      
int main()
{
    int m;
    scanf("%d",&m);
    while(m--)
    {
        memset(a,0,sizeof(a));
        int n,t=1;
        scanf("%d",&n);
        if(n==1||n==-1)
           printf("%d\n",n);
        else
        {
             if(n<0)
             {
                 n=-n;
                 printf("-");
             }printf("0.");
        while(t&&a[t]!=1)                          //判断 循环
        {
            a[t]=1;
           t*=10;
           printf("%d",t/n);
           t%=n;
        }printf("\n");
        }

    }return 0;
}


运行时错误:
常见出错的原因可能有以下几种:
1、数组开得太小了,导致访问到了不该访问的内存区域
2、发生除零错误
3、大数组定义在函数内,导致程序栈区耗尽
4、指针用错了,导致访问到不该访问的内存区域
5、还有可能是程序抛出了未接收的异常