`
radovi
  • 浏览: 64645 次
  • 性别: Icon_minigender_1
  • 来自: 杭 州
社区版块
存档分类
最新评论

解决万恶的大数问题

阅读更多

由于电脑的智商有限啊 我的智商是没问题的
呵呵 大数问题一直困扰着我 不只是我阿 身边的同学作acm的问题 也一直有大树问题  呵呵

其实 java中早就有现成的解决方法了的
在java的math的包下面有BigInteger和BigDecimal两个类 可以用来解决部分大数问题 而且相当之精确

这里 从数据结构的角度出发  一维数组也可以解决大数问题

如下

# /**   
#  * ***********CopyRight**************   
#  *-------Powered by QianXunNet-----   
#  *-----Version 1.1   2009-01-22-----    
#  *-----   Design BY  NiChao    -----   
#  *^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
#  */ 
package array;
import java.util.*;
public class nc030 {

   
    public static void main(String[] args) throws Exception {   
        // TODO Auto-generated method stub

        int[] date=new int[100];        //可以存放40个数字
        date[1]=1;
        int weishu=1;                     //求出来的值得位数
       
        System.out.println("------用数组解决大数问题---------");
        System.out.println("检验对象:求n!的值");
        System.out.println("input the n=");
       
        Scanner cin=new Scanner(System.in);
       
        int n=cin.nextInt();
         int i=1;
        for(i=1; i<=n;i++){
            for(int j=1;j<=weishu;j++)
                   date[j]=date[j]*i;
            for(int j=1;j<=weishu;j++ )
            {
                if(date[j]>=10)    // 原本此处及下面无等号 多谢好心的网友把我的程                                   //序测试了几组数据,我才回过头来检查谢谢了。
                    for(int r=1;r<=weishu;r++)
                    {
                        if(date[weishu]>=10)
                            weishu++;
                        date[r+1]=date[r+1]+date[r]/10;    //这里有很多次在做无用功  值得改进 
                        date[r]=date[r]%10;
                    }
            }
        }
       
        System.out.print(i-1+"!= ");
        for(int k=weishu;k>=1;k--)
        {
            System.out.print(date[k]);
        }
        System.out.println("");
       
    }

}


运行结果如下
------用数组解决大数问题---------
检验对象:求n!的值
input the n=
35
35!= 10333147966386144929666651337523200000000
分享到:
评论
9 楼 czan.ok 2009-02-25  
学习,路过
8 楼 haisheng 2009-02-25  
<p>改进你的算法,提高效率 </p>
<pre name="code" class="java">import java.util.Scanner;

public class nc030 {

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub

int[] date = new int[100000];
date[1] = 1;
int weishu = 1; // 求出来的值的位数

System.out.println("------用数组解决大数问题---------");
System.out.println("求n!的值");
System.out.print("n=");

Scanner cin = new Scanner(System.in);

int n = cin.nextInt();
for (int i = 1; i &lt;= n; i++) {
for (int j = 1; j &lt;= weishu; j++) {
date[j] = date[j] * i;
}

// 确保除最高位外的每位不大于9
for (int j = 1; j &lt; weishu; j++) {
if (date[j] &gt;= 10) {
date[j + 1] += date[j] / 10;
date[j] = date[j] % 10;
}
}
//确保最高位不大于9
while (date[weishu] &gt;= 10) {
weishu++;
date[weishu] += date[weishu - 1] / 10;
date[weishu - 1] = date[weishu - 1] % 10;
}
}

System.out.print(n + "!= ");
for (int k = weishu; k &gt;= 1; k--) {
System.out.print(date[k]);
}
System.out.println("");

}

}
</pre>
<p> </p>
7 楼 radovi 2009-02-04  
cpdw 写道

radovi 写道cpdw 写道楼主的这个算法有错误啊,当算比较小的数值的阶乘时没有问题,超过某一个值(我没有验证),结果就不对了,例如你自己的例子:35!,正确结果应该是:10333147966386144929666651337523200000000,你这明显有问题,看看哪里有问题?

不是 对的呀 我把数组的大小开大后 还是这个值呀 35!= 15002590386144929666651337523200000000
不是数组大小的问题,我数组设在400算35!就有问题,是算法的问题,你的程序如果数组不够大,不会自动舍去,而会抛出数组越界的异常,你查查看,35!的正确结果确实应该是10333147966386144929666651337523200000000
我验证了下,26之前的结果都是正确的,从27开始,结果就开始错了,你查下



搞得我晚饭都没怎么安心的吃啊!唉!算是解决了。   是我的算法有错误 首先先谢谢阁下能真么认真的看我的程序   上面代码中我已经修改了    

# if(date[j]>10)  
#                     for(int r=1;r<=weishu;r++)  
#                     {  
#                         if(date[weishu]>10)  
#                             weishu++;  
#                         date[r+1]=date[r+1]+date[r]/10;              //这里有很多次在做无用功  值得改进   
#                         date[r]=date[r]%10;  
#                     }  

这块语句出错了 data[j]>=10 以及 data[weishu]>=10

如下
# if(date[j]>=10)  
#                     for(int r=1;r<=weishu;r++)  
#                     {  
#                         if(date[weishu]>=10)  
#                             weishu++;  
#                         date[r+1]=date[r+1]+date[r]/10;              //这里有很多次在做无用功  值得改进   
#                         date[r]=date[r]%10;  
#                     }
6 楼 cpdw 2009-02-04  
radovi 写道
cpdw 写道
楼主的这个算法有错误啊,当算比较小的数值的阶乘时没有问题,超过某一个值(我没有验证),结果就不对了,例如你自己的例子:35!,正确结果应该是:10333147966386144929666651337523200000000,你这明显有问题,看看哪里有问题?


不是 对的呀 我把数组的大小开大后 还是这个值呀 35!= 15002590386144929666651337523200000000

不是数组大小的问题,我数组设在400算35!就有问题,是算法的问题,你的程序如果数组不够大,不会自动舍去,而会抛出数组越界的异常,你查查看,35!的正确结果确实应该是10333147966386144929666651337523200000000
我验证了下,26之前的结果都是正确的,从27开始,结果就开始错了,你查下
5 楼 radovi 2009-02-04  
cpdw 写道
楼主的这个算法有错误啊,当算比较小的数值的阶乘时没有问题,超过某一个值(我没有验证),结果就不对了,例如你自己的例子:35!,正确结果应该是:10333147966386144929666651337523200000000,你这明显有问题,看看哪里有问题?


不是 对的呀 我把数组的大小开大后 还是这个值呀 35!= 15002590386144929666651337523200000000
4 楼 radovi 2009-02-04  
cpdw 写道
楼主的这个算法有错误啊,当算比较小的数值的阶乘时没有问题,超过某一个值(我没有验证),结果就不对了,例如你自己的例子:35!,正确结果应该是:10333147966386144929666651337523200000000,你这明显有问题,看看哪里有问题?


嗯嗯 是的 谢谢你了

确实错了
如果要算35!的阶乘 应该将数组的大小开大点

上面代码中
       int[] date=new int[40];        //可以存放40个数字  
       date[1]=1;  


35!之所以错 就是因为他舍掉了几位数字


上次测试的时候就是没写上异常处理 所以即使他数组越界了 我没有发现 我改了
将以下这部分改进
#    public static void main(String[] args) {  
#         // TODO Auto-generated method stub  


3Q
3 楼 cpdw 2009-02-04  
楼主的这个算法有错误啊,当算比较小的数值的阶乘时没有问题,超过某一个值(我没有验证),结果就不对了,例如你自己的例子:35!,正确结果应该是:10333147966386144929666651337523200000000,你这明显有问题,看看哪里有问题?
2 楼 radovi 2009-02-03  
leeldy 写道
ACM里面有很多大数问题,可能问题简单,但是结果出乎你的意料。。。
C做大数运算是一件很有挑战性的事情
最普通的做法就是利用数组,最普遍最基础的题目就是算1000!结果了
算法是可行的,只是需要很多优化
比如动态预测数组空间,避免重复运算什么的

呵呵。acm都是那帮牛人们的事情。
上次我离散数学老师还和我们说了有一个算法。听得云里雾里的。
他说用字符串来弄。好像还要用到什么二进制的知识……
1 楼 leeldy 2009-02-03  
ACM里面有很多大数问题,可能问题简单,但是结果出乎你的意料。。。
C做大数运算是一件很有挑战性的事情
最普通的做法就是利用数组,最普遍最基础的题目就是算1000!结果了
算法是可行的,只是需要很多优化
比如动态预测数组空间,避免重复运算什么的

相关推荐

    万恶的前端内存泄漏及万善的解决方案详解.docx

    在本文中,我们将讨论前端内存泄漏的四种常见原因及其解决方案,并且探讨 Vue SPA 中的内存泄漏问题。 一、意外的全局变量 在 JavaScript 中,未声明的变量将被添加到全局对象中,如果在浏览器中,全局对象就是 ...

    万恶的Blogbus教程免费版.rar

    由于是“万恶的”版本,可能意味着这个教程非常全面且深入,覆盖了用户可能遇到的各种问题和挑战。 通过这个教程,学习者可以了解如何利用Blogbus构建自己的在线存在,包括如何创建吸引人的博客布局,发布高质量的...

    万恶之源2011VIP内部135

    【万恶之源2011VIP内部135】是一个特定版本的网络安全工具,由“万恶之源网安基地”站长开发。这个工具的名称中提到的“135抓鸡”,实际上指的是在网络安全领域中寻找并控制易受攻击的服务器或计算机的行为,这些...

    万恶的反对风格如果我

    很抱歉,但根据您提供的信息,标题"万恶的反对风格如果我"和描述"斯蒂芬告诉对方告诉对方告诉对方告诉对方的方式告诉对方公司法"似乎与IT知识不直接相关,同时也无法明确地指向任何特定的技术主题。标签"法大赛官方...

    万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题

    【标题】:“万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题” 在探讨Appfuse 2.x在MyEclipse中的部署问题前,我们先来了解下Appfuse和MyEclipse这两个关键概念。 Appfuse是一个开源项目,它提供了一种快速...

    android去万恶的广告补丁

    "android去万恶的广告补丁"是一个针对这一问题的解决方案,旨在帮助用户去除应用程序中的广告,提升使用舒适度。这个补丁由开发者首次发布,表达了他们希望通过提供这种服务来获得用户的支持,并承诺未来会有更多...

    万恶的斐波那契.exe

    万恶的斐波那契.exe

    万恶的足球比赛.zip

    全国大学生电子设计竞赛(National Undergraduate Electronics Design Contest),试题,解决方案及源码。计划或参加电赛的同学可以用来学习提升和参考。程序均是实战案例,经过测试可直接运行。 全国大学生电子...

    《万恶迷糊尤物》第三技:笑看混战人1000字.docx

    此外,《万恶迷糊尤物》在情节构建上还巧妙地运用了冲突和解决的手法。故事中的冲突并非仅仅是对立的双方之间的战争,更是人物内心的挣扎与外界压力的抗衡。格湘的真实身份问题成为了一种内心深处的冲突,安洁的指控...

    SSM框架配置 底层配置万用模板(x)万恶之源(√)

    然而,如果配置过于通用,可能会带来问题,因为每个项目都有其特定的需求,过度模板化的配置可能会限制项目的灵活性,这可能是为什么描述中称其为“万恶之源”。 文件名为"meow",在上下文中可能表示这个压缩包里...

    万恶的selinux导致dns slave服务器无法正常获取master上的信息

    通过上述步骤,我们可以有效地解决由SELinux引起的DNS Slave服务器无法正常获取Master服务器上的信息的问题。值得注意的是,在进行任何SELinux配置更改时都应谨慎操作,以避免影响系统的整体安全性。对于更复杂的...

    万恶的凯撒加密1

    凯撒加密,又称为移位密码,是一种古老且基础的加密技术,源于古罗马时期的军事通信,用以保护敏感信息不被敌人截获。它的基本原理是将明文中的每个字母按照固定的距离在字母表上向前或向后移动,以此达到加密的效果...

    万恶的音乐符号1

    在音乐的世界里,符号是传达旋律、节奏和情感的关键元素。音乐符号的种类繁多,它们各有特定的含义,能够指示演奏者如何演绎乐曲。在这个故事中,超帆正面临一个挑战,他需要理解森森哼唱的一段曲子所包含的信息。...

    操作手册请勿而且万恶

    在当今快速变化的企业环境中,信息化已成为推动企业进步的关键力量。人力资源作为企业发展的核心资源,其管理方式的变革尤为重要。集团在追求人力资源信息化建设的过程中,深刻认识到这一点,并以此为出发点,致力于...

    我认为二位二万恶玩儿

    玩儿玩儿万恶人恶趣味而且维尔萨芬撒大幅撒大幅

    oracle-查找硬解析问题SQL语句

    在数据库中硬解析是万恶之源,为大家提供一个查找并且定位oracle硬解析问题SQL语句脚本

    详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决

    最近遇到一个问题,用 Vue 开发的项目在最近两年新出的安卓手机上没问题,在三四年前的旧...网上的文章大部分是 Vue-cli 2.x 版本的解决方案,但 Vue-cli 3 跟之前的版本还是有很大差异的,可能是我比较菜,看了 n 篇文

    Tomcat 不显示详细日志的问题

    Tomcat 不显示详细日志的问题解决方案 Tomcat 是一个流行的 Java Web 服务器,用于部署和运行基于 Java 的 Web 应用程序。...通过配置 log4j.properties 文件,我们可以根据需要记录详细的错误日志,从而解决问题。

    C#小技巧 万恶的10字

    ### C#小技巧详解 #### 一、颜色值转换技巧 在C#中,颜色值的处理是非常常见的需求之一,特别是在进行UI设计时。这里介绍一个实用的小技巧:如何将`System.Drawing.Color`结构体的颜色值转换为16进制字符串,并反...

Global site tag (gtag.js) - Google Analytics