一个简单的数学题
时间限制:3 Sec 内存限制:64 MiB special judge:No
题目描述
zyc最近迷上了数学,一天,dj想出了一道数学题来难住他。算出1/n,但zyc一时答不上来希望大家能编程帮助他。
输入
第一行整数T,表示测试组数。后面T行,每行一个整数 n (1<=|n|<=10^5).
输出
输出1/n. (是循环小数的,只输出第一个循环节).
样例输入
复制
4
2
3
7
168
样例输出
复制
0.5
0.3
0.142857
0.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];
#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");
}
{
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、还有可能是程序抛出了未接收的异常