例题:http://120.78.128.11/Problem.jsp?pid=2787
利用余数和商解题
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(void){
int n,k,digit[100010],vis[100010];
while(cin>>n)){
if(n==1){
printf("1\n"); //为1的时候 即 1/1=1;
}
else if(n==-1){
printf("-1\n"); //为-1的时候 即 1/-1=-1;
}
else{
if(n<0){
cout<<"-";
n=-n; //转换为正数
}
memset(vis,0,sizeof(vis));
k=1; //即 1%n=1;
/*k代表余数*/
int cnt=0; //记录数组的下标
vis[k]=true; //判断余数是否已经出现过
/*若余数出现过 则说明已经出现了循环节*/
cout<<"0.";
while(k){
k*=10; //相当于每次在余数后添加个0
digit[cnt++]=k/n; //用数据记录商
k%=n; //求每次运算的的余数
if(vis[k]==true)break; //找到循环节
vis[k]=true;
}
for(int i=0;i<cnt;i++){
cout<<digit[i];
}
cout<<endl;
}
}
return 0;
}
拓展: 输出m/n.(是循环小数的,只输出第一个循环节).
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(void){
int m,n,k,digit[100010],vis[100010];
while(cin>>m>>n){
if(m<0&&n>0){
cout<<"-";
m=-m;
}
else if(m>0&&n<0){
cout<<"-";
n=-n;
}
memset(vis,0,sizeof(vis));
k=m%n;
int cnt=0;
vis[k]=true;
if(m%n==0){
cout<<m/n;
}
else{
cout<<m/n<<".";
}
while(k){
k*=10;
digit[cnt++]=k/n;
k%=n;
if(vis[k]==true)break;
vis[k]=true;
}
for(int i=0;i<cnt;i++){
cout<<digit[i];
}
cout<<endl;
}
return 0;
}