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

例题: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值