除法的可除尽和小数循环

除法的可除尽:


1)对于两个互质的正整数(A,B),如果B含有除2,5以外的素因子,则A/B是不可以除尽的。

2)对于两个不互质的正整数,gcd(A,B)约分成互质。

小数循环:

1)模拟除法,余数自乘10,再除以除数。
2)判断循环节。只有商和余数同时出现在同一位置时,才是循环节。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
int pos;
bool Find(int *sha,int *rem,int s,int r,int p)
{
    for(int i=0; i<p; i++)
    {
        if(sha[i]==s&&rem[i]==r)   //判断余数和商是否同时出现过
        {
            pos=i;
            return true;
        }
    }
    return false;
}
void cal(int n,int m)
{
    int sha[150],rem[150],z,s,r,e;
    int sh=0,re=0;
    mem(sha,0);
    mem(rem,0);
    z=n/m;
    if(n>=m)
        n=n%m;    //求余数,如果n<m,n就是余数s。
    n*=10;
    s=n/m;
    r=n%m;
    while(!Find(sha,rem,s,r,re))
    {
        sha[sh++]=s;
        rem[re++]=r;
        r*=10;
        s=r/m;
        r=r%m;
    }
    cout<<z<<".";              //输出整数
    for(int i=0; i<pos; i++)   //输出不循环的小数
        cout<<sha[i];
    for(int i=120; i>=0; i--)  //判断第一次循环结束的位置
    {
        if(sha[i])
        {
            e=i;
            break;
        }
    }
    for(int i=pos;i<=e;i++)     //输出循环的
    {
        if(i==pos)
            cout<<"[";
        cout<<sha[i];
        if(i==e)
            cout<<"]";
    }
}
int main()
{
    int p,q;
    scanf("%d%d",&p,&q);
    cal(p,q);
    return 0;
}

<think>嗯,用户想问的是如何判断Java中BigDecimal的除法结果是否为整数。首先,我需要回顾一下BigDecimal的除法操作。记得之前处理BigDecimal的时候,如果不指定小数位数或者舍入模式,可能会抛出ArithmeticException,尤其是当结果无法精确表示的时候,比如无限循环小数的情况。所以正确的做法是使用带有精度舍入模式的方法。 用户的问题是如何判断结果是否为整数。那可能的思路是什么呢?首先,进行除法运算时需要设置足够的小数位数,或者使用某种方式检查余数是否为0。比如,用divideAndRemainder方法,得到一个数组,其中第二个元素就是余数。如果余数是零,那么结果就是整数。 不过,BigDecimal的divideAndRemainder返回的是商余数,这时候余数为0的话,说明被数可以被数整,那么结果自然就是整数。这种方法可能更直接,不需要处理舍入的问题,避免因为舍入而导致的误判。 另外,用户可能想用除法后的结果,再检查小数部分是否为零。这时候需要考虑如何获取小数部分。比如,可以用stripTrailingZeros()去掉末尾的零,然后取scale来判断小数点后的位数,如果scale小于等于0,说明是整数。或者,用remainder(BigDecimal.ONE)来取余数1,如果余数为0,则是整数。 但需要注意,当使用除法时,必须指定舍入模式,否则可能抛出异常。所以在使用除法方法时,必须提供精度舍入模式参数。例如,使用divide方法时,设定scale为0,然后检查是否除尽。或者,使用divideToIntegralValue方法,这个方法会返回商的整数部分,忽略小数部分,但如果想要判断是否刚好整,可能还是需要用余数的方法。 综上,可能有几种方法: 1. 使用divideAndRemainder方法,检查余数是否为0。 2. 用除法后的结果,检查小数部分是否为0,比如用stripTrailingZeros().scale() <=0。 3. 或者使用setScale(0)并捕获异常,但这种方法可能不太可靠。 不过第一种方法可能更可靠,因为直接使用余数来判断。例如: BigDecimal dividend = new BigDecimal("10"); BigDecimal divisor = new BigDecimal("2"); BigDecimal[] result = dividend.divideAndRemainder(divisor); if (result[1].compareTo(BigDecimal.ZERO) == 0) { // 是整数 } 这样就不会涉及到舍入的问题,结果更准确。而如果用除法运算的话,可能需要设置正确的scale,并且处理舍入模式,可能会有误差。 所以,正确的做法应该是使用divideAndRemainder方法来判断余数是否为0。这样可以确保没有舍入误差,准确判断结果是否为整数。 不过用户提到的是除法结果是否为整数,可能是指商是否为整数,而余数是否为零。这时候用divideAndRemainder更直接。另外,需要注意,当数为0的时候需要处理异常,但用户的问题应该已经排了这种情况。 因此,总结步骤应该是: 1. 使用divideAndRemainder方法获取余数。 2. 比较余数是否为0,如果是,则商为整数。 这种方法不需要设置舍入模式,也不会抛出异常,因为divideAndRemainder方法不需要指定scale,它会返回精确的结果,只要数是精确表示的。 因此,用户的问题的解决方案应该是这样的。同时需要引用相关的参考资料,例如引用中的divide方法需要设置scale舍入模式,但在这里使用divideAndRemainder可能更合适。</think>要判断Java中$BigDecimal$的除法结果是否为整数,可通过以下步骤实现: 1. **使用$divideAndRemainder$方法计算余数** 该方法返回包含商余数的数组,若余数为零则结果为整数: ```java BigDecimal dividend = new BigDecimal("10"); BigDecimal divisor = new BigDecimal("3"); BigDecimal[] result = dividend.divideAndRemainder(divisor); boolean isInteger = (result[1].compareTo(BigDecimal.ZERO) == 0); // 余数为0时返回true ``` 2. **直接通过余数判断** 若仅需判断是否整,可直接用$remainder$方法简化代码: ```java boolean isInteger = dividend.remainder(divisor).equals(BigDecimal.ZERO); ``` **注意事项** - 使用$divide$方法时需指定精度舍入模式,否则可能抛出$ArithmeticException$[^1] - 若结果小数位数为零(如$10.0$),可用$stripTrailingZeros().scale() \leq 0$判断,但需注意舍入误差[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值