A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨庆雷 中级黑马   /  2014-4-12 15:34  /  2899 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨庆雷 于 2014-4-12 21:21 编辑

求13的13次方的最后三位数
第一个方法是自己的
第二个方法 有点看不懂  帮解释下

package BaseTest;

public class CiFang {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                cifang();
                cifang2();
        }
        
        public static void cifang(){
                double m = Math.pow(13, 13);
                int i ;
                for (i = 1; (int)(m/Math.pow(10,i)) > 1; i++) {
                }
                for (int j  = i; j >2; j--) {
                        m = m%(Math.pow(10,j));

                }
                int n = (int)m;
                System.out.println(n);
        }
        
        
        
        public static void cifang2()
        {
                int num=13,i,sum=1;
                for(i=1;i<=13;i++)
                {
                        sum*=num;
                        if(sum>1000) sum%=1000;
                }
                System.out.println("13^13次方最后三位:"+sum);
        }
}

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

12 个回复

倒序浏览
本帖最后由 ò壞尛孩 于 2014-4-12 16:06 编辑

public static void cifang2()
        {
                int num=13,i,sum=1;
                for(i=1;i<=13;i++)
                {
                        sum*=num;
                        if(sum>1000) sum%=1000;
                }
                System.out.println("13^13次方最后三位:"+sum);
        }
这个方法很好理解,因为你要取后三位数,sum开始=1,每乘以13一次,模1000取后三位,再用后三位乘以13这样的13次循环,不仅减少了开销资源还节省了很多不必要的运算,这个方法很经典!
你的方法我看半天才看懂,你是一次性求13的13次方,然后用循环求结果有多少位数i!然后从最高位开始模运算,最后剩下三位是吧!我只想说你可以撞墙了啊(或者拿块板砖敲自己)!建议去看下大数运算!你都算出13的13次方的结果了,你还整那么多干嘛,直接模1000不就是结果了嘛!:funk:但是不建议这么做,13的13次方你知道要消耗多少资源啊!?

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 山寨

查看全部评分

回复 使用道具 举报
ò壞尛孩 发表于 2014-4-12 16:04
public static void cifang2()
        {
                int num=13,i,sum=1;

谢谢啊  板砖准备好了  下不去手啊:Q
回复 使用道具 举报
主要原理就是低位的运算会影响高位的运算,但是高位的运算不会影响低位的运算。所以既然需要的是后三位,那么我就一直使用后三位来进行运算。取后三位的方法当然就是%1000
回复 使用道具 举报
杨庆雷 发表于 2014-4-12 16:16
谢谢啊  板砖准备好了  下不去手啊

淡定!我也是菜鸟!一起加油!我的技术分不够啊,想赚点分,好报名!
回复 使用道具 举报
李程 发表于 2014-4-12 18:49
主要原理就是低位的运算会影响高位的运算,但是高位的运算不会影响低位的运算。所以既然需要的是后三位,那 ...

thank you         
回复 使用道具 举报
job 中级黑马 2014-4-12 21:27:15
7#

LZ请问怎么把帖子设为  提问结束
回复 使用道具 举报
job 发表于 2014-4-12 21:27
LZ请问怎么把帖子设为  提问结束

图片右下角 编辑  进去后 改为提问结束

(44.05 KB, 下载次数: 53)

1J]{BLQ5USJM0ET]MDY7IS0.jpg (24.32 KB, 下载次数: 58)

1J]{BLQ5USJM0ET]MDY7IS0.jpg
回复 使用道具 举报
job 中级黑马 2014-4-12 21:36:45
9#
杨庆雷 发表于 2014-4-12 21:34
图片右下角 编辑  进去后 改为提问结束

谢啦!终于找到了!
回复 使用道具 举报
一楼正解。。。
回复 使用道具 举报
  1.    public static void cifang2( )
  2.         {
  3.                 int num=13,i,sum=1;
  4.                 for(i=1;i<=13;i++)
  5.                 {
  6.                         sum*=num;
  7.                         if(sum>1000)
  8.                                 sum%=1000;
  9.                 }
  10.                 System.out.println("13^13次方最后三位:"+sum);
  11.         }
复制代码


方法二你肯定是sum%=1000;这一句不明白了,道理很简单,求后三位嘛,千位和千位以上的数字是没用的,直接去掉就行。
另外如果你直接求出13^13这个数字肯定超过int取值范围了,还得用大数太麻烦,还占用资源
回复 使用道具 举报
你可以试着用很多数字去除余1000,是不是都是剩下最后的三位在而已
回复 使用道具 举报
public class BaseTest {
        public static void main(String[] args) {
                cifang();
        }
       
        public static void cifang(){
                System.out.println(Math.pow(13, 13)%1000);
        }
}
其实第二种方法和以上的这样一样,最终都是Math.pow(13, 13)%1000,如果你看不懂他说的那个方法的话,就是
                for(i=1;i<=13;i++)
                {
                        sum*=num;
                        if(sum>1000) sum%=1000;
                }中的sum>1000你可能误解他的意思了,我想你可能当sum>1000时,就停止了for循环,如果你这样认为的话,那你就错了,刚开始的时候我也是这样认为的,其实在sum>1000时,还继续着for循环,直到13个13相乘完才结束for循环。
还有就是我认为,你说的那两个方法代码都不够优化,尤其是第一个方法,本来一个简单的问题,你把它复杂化了。
以上是我的个人见解,不足之处,还请见谅!!!


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马