小数循环节问题--2018

输入三组正整数N,D,求N/D

(1)若能除尽,则直接输出
(2)若为循环小数,则输出前几位并用空格括起来
(3)若无法除尽,则保留小数并用空格括起来
如 输入8/5 1/3 11/13
输出
8/5=1.6
1/3=.(3)
11/13=.(846153)

思路:(参考博文https://blog.csdn.net/sinat_33442459/article/details/64126593)
例:N=3,D=7;
(1)3<7,310/7=4,余数=2
(2)2<7,2
10/7=2,余数=6
(2)6<7,610/7=8,余数=4
(2)4<7,4
10/7=5,余数=5
(2)5<7,510/7=7,余数=1
(2)1<7,1
10/7=1,余数=3
(2)3<7,310/7=4,余数=2
(2)2<7,2
10/7=2,余数=6
(2)6<7,6*10/7=8,余数=4

循环节已经出现428571
由此,计算循环小数循环节的方法就有了,
1)在n>d情况下,n=n%d得出小于d的n,因为这样可以较好的保留小数点后面的小数部分;
2)n<d时,不断用n10/7得到小数第一位,存储在整数数组a[101]中,剩下的余数即(n10)%d再重新赋予n,此时n必定小于d,如此循环多次,得到足够的小数部分存储在a[101]中,此过程由test()函数实现
3)考虑如何求出该数组中的循环节: 判断循环的关键就是判断之后计算出来的余数是否与第一个余数相等,此过程由output()函数实现;
在解决了最棘手的一个问题后,剩余还有两个问题:

  1. 若能除尽,就不能用上述方法,所以在main函数里检查能否除尽,方法就是用余数乘以10再模d,若为零,则能除尽,如8/5:8%5=3,(3*10)%5=0;同时对于两个Int型整相除,可强制转换为float型保留小数;
  2. 与输入相关,这里输入三组数,再分别计算,不容易弄,所以可构造结构数组就简单多了,先一起输入,再分别解决。

代码:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct intandchar{
    int x,y;
    char ch;
};

void test(int n,int d,int a[]){
    int i=0;
    for(i=0;i<101;i++)
    {
        n=n*10;
        a[i]=n/d;
        n=n%d;
    }
}

void output(int a[])
{
    int t=0;
    for(int i=1;i<101;i++){
        if(a[0]==a[i]){
            t=i;
            break;
        }
    }
    cout<<"."<<"(";
    for(int i=0;i<t;i++){
        cout<<a[i];
    }
    cout<<")"<<endl;
}


int main()
{
    intandchar ic[3];
    for(int i=0;i<3;i++){
        cin>>ic[i].x>>ic[i].ch>>ic[i].y;
    }

    for(int i=0;i<3;i++){
        int n=ic[i].x;int d=ic[i].y;
        int a[101]={0};
        int flag=0;

        cout<<ic[i].x<<ic[i].ch<<ic[i].y<<"=";
        
        if(n>=d){
            int temp=n%d;
            if((temp*10)%d==0){
                flag=1;
                cout<<(float(n)/float(d))<<endl;
            }
            else n=n%d;
        }
        if(flag==0){
            test(n,d,a);
            output(a);
        }

    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值