1 solutions
-
0
emmmm,首先我们要注意数据的范围n(1 <= |n| <= 10^5).这里的n可以是负数,所以当我们判断他是负数时要在答案前面加个负号
if(n<0){ printf("-"); n=abs(n); }
然后当n为一时,我们就根本不用做运算,直接输出就是了
if(n==1){ printf("1\n"); continue; }
最后就的对n这个数进行运算,结果一定是小于0的数,所以我们先输出0.就行
printf("0.");
因为是1除以一个数,当我们除不尽我们是不是就要向后移动一位,然后借一个0,就变成10,再除,如果还是除不尽,我们是不是就要继续借0,依次下去。我们就可以,当余数是我们之前遇到过的,说明就到了循环点了,我们就直接退出循环,结束运算;如果没有遇到,我们是不是继续借0来进行除法。
int i=1; flage[1]=true; while(i){ i*=10; printf("%d",i/n); i%=n; if(flage[i])break; flage[i]=true; }
这就是整合代码
#include<iostream> #include<cstdio> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<stack> #include<queue> #define lowbits(x) ((-x)&x) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e6+5; typedef long long ll; int gcd(int a,int b) { return b>0 ? gcd(b,a%b):a; } int n,m; int a[N]; int find(int n,int x){ int l=-1,r=n; while(l+1<r){ int mid = l+r>>1; if(a[mid]<=x) l =mid; else r=mid; } return r; } bool flage[N]; int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int n; int t; scanf("%d",&t); while(t--){ scanf("%d",&n); memset(flage,false,sizeof(flage)); if(n<0){ printf("-"); n=abs(n); } if(n==1){ printf("1\n"); continue; } printf("0."); int i=1; flage[1]=true; while(i){ i*=10; printf("%d",i/n); i%=n; if(flage[i])break; flage[i]=true; } printf("\n"); } return 0; }
- 1
Information
- ID
- 6674
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- (None)
- # Submissions
- 98
- Accepted
- 16
- Uploaded By