A simple problem
Problem Description
Zty很痴迷数学问题.。一天,yifenfei出了个数学题想难倒他,让他回答1 / n。但Zty却回答不了_. 请大家编程帮助他.
Input
第一行整数T,表示测试组数。后面T行,每行一个整数 n (1<=|n|<=10^5).
Output
输出1/n. (是循环小数的,只输出第一个循环节).
Sample Input
4
2
3
7
168
Sample Output
0.5
0.3
0.142857
0.005952380
解题思路:
手写函数模拟除法,记录每一次除的余数,开一个标记数组,如果某个余数已经出现过,那么往后除出来的结果必然和前面相同,即是第二次循环的开始,因此循环节就是这之前的所有数。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int mark[100050]; // 标记数组
int main()
{
int n;
int t;
cin>>t;
while(t--)
{
cin>>n;
memset(mark,0,sizeof(mark)); // 清空标记
if(n < 0) // 负数先判断,输出负号
{
cout<<"-";
n = -n;
}
if(n == 1) // 1 特判
{
cout<<"1"<<endl;
continue;
}
else
{
cout<<"0.";
int tmp1 = 1;
while(!mark[tmp1] && tmp1) // 整除或者找到循环节 结束算法
{
mark[tmp1] = 1; // 标记余数
tmp1 *= 10; // 被除数添0
cout<<tmp1/n; // 输出商
tmp1 %= n; // 取余数
}
cout<<endl;
}
}
return 0;
}