java - 较大值的错误结果

标签 java algorithm

我在试一道编程题,语句是 如果我们列出所有 10 以下的自然数,它们是 3 或 5 的倍数,我们得到 3、5、6 和 9。这些倍数的和是 23。像这样我们必须找到't'测试的倍数和每个案例都有“n”值,我试图找到解决方案,我的代码是

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {

        long t,n,sum;
        Scanner in=new Scanner(System.in);
        t=in.nextLong();
        for(int i=0;i<t;i++)
        {
            sum=0;
            n=in.nextLong();
            long l3=0,l5=0,l15=0;
            for(int j=3;j>0;j--)
                if((n-j)%3==0&&j<n)
                {
                l3=n-j;
                break;
            }
            for(int j=5;j>0;j--)
                if((n-j)%5==0&&j<n)
                {
                l5=n-j;
                break;
            }
            for(int j=15;j>0;j--)
                if((n-j)%15==0&&j<n)
                {
                l15=n-j;
                break;
            }

            sum+=(float)(((float)l3/(float)3)/(float)2)*(float)(l3+3);

            sum+=(float)(((float)l5/(float)5)/(float)2)*(float)(l5+5);

            sum-=(float)(((float)l15/(float)15)/(float)2)*(float)(l15+15);
            System.out.println(sum);    

        }
    }
} 

我给出的输入是,

12
10
11
12
13
1000
1001
1002
1003
100000000
100000001
100000002
100000003

这里12是测试用例的数量。

我得到的输出是

23
33
33
45
233168
234168
234168
235170
2333333593784320
2333333593784320
2333333593784320
2333333593784320

这里的问题是测试用例 10,11,12,13,1000,1001,1002,1003 中的值的答案是正确的,但对于剩余更大的输入,输出是错误的。我找不到我丢失的东西。你能帮我解释一下为什么我会得到这种错误的结果以及如何纠正它。

最佳答案

使用 BigDecimal 和 BigInteger 可以获得更高的精度和更大的数字:

package test;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {

        long t,n;
        BigInteger sum;
        Scanner in=new Scanner(System.in);
        t=in.nextLong();
        for(int i=0;i<t;i++)
        {
            sum = BigInteger.ZERO;
            n=in.nextLong();
            long l3=0,l5=0,l15=0;
            for(int j=3;j>0;j--)
                if((n-j)%3==0&&j<n)
                {
                    l3=n-j;
                    break;
                }
            for(int j=5;j>0;j--)
                if((n-j)%5==0&&j<n)
                {
                    l5=n-j;
                    break;
                }
            for(int j=15;j>0;j--)
                if((n-j)%15==0&&j<n)
                {
                    l15=n-j;
                    break;
                }

            BigDecimal x = BigDecimal.valueOf(l3)
            .divide(BigDecimal.valueOf(6))
            .multiply(BigDecimal.valueOf(l3+3));
            sum=sum.add(x.toBigIntegerExact());
            x = BigDecimal.valueOf(l5)
            .divide(BigDecimal.valueOf(10))
            .multiply(BigDecimal.valueOf(l5+5));
            sum=sum.add(x.toBigIntegerExact());
            x = BigDecimal.valueOf(l15)
            .divide(BigDecimal.valueOf(30))
            .multiply(BigDecimal.valueOf(l15+15));
            sum=sum.subtract(x.toBigIntegerExact());

            System.out.println(sum);    
        }
    }
} 

关于java - 较大值的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35205609/

相关文章:

java - 为什么我的 mysql 服务器上不断出现 Converting HEAP to MyISAM

algorithm - fft - 优化代码以消除高于 Nyquist 的图像

python - 如何更有效地检查游戏板上的条纹?

algorithm - 数据结构、算法、基础计算机科学、在线资源的比较

iphone - 在字符串中存储单词的优雅算法

java - 更新所有框架中的自定义 JLabel

java - 在两个构造函数中初始化最终变量

Java 与 CRM Dynamics 2011 集成问题

java - 一组子集中的数字总和

algorithm - K-means 能否用于帮助基于像素值的图像分离?