黑马程序员技术交流社区

标题: 代码帮看下 [打印本页]

作者: 杨庆雷    时间: 2014-4-12 15:34
标题: 代码帮看下
本帖最后由 杨庆雷 于 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);
        }
}
作者: ò壞尛孩    时间: 2014-4-12 16:04
本帖最后由 ò壞尛孩 于 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次方你知道要消耗多少资源啊!?
作者: 杨庆雷    时间: 2014-4-12 16:16
ò壞尛孩 发表于 2014-4-12 16:04
public static void cifang2()
        {
                int num=13,i,sum=1;

谢谢啊  板砖准备好了  下不去手啊:Q
作者: 李程    时间: 2014-4-12 18:49
主要原理就是低位的运算会影响高位的运算,但是高位的运算不会影响低位的运算。所以既然需要的是后三位,那么我就一直使用后三位来进行运算。取后三位的方法当然就是%1000
作者: ò壞尛孩    时间: 2014-4-12 20:41
杨庆雷 发表于 2014-4-12 16:16
谢谢啊  板砖准备好了  下不去手啊

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

thank you         
作者: job    时间: 2014-4-12 21:27
杨庆雷 发表于 2014-4-12 21:21
thank you

LZ请问怎么把帖子设为  提问结束
作者: 杨庆雷    时间: 2014-4-12 21:34
job 发表于 2014-4-12 21:27
LZ请问怎么把帖子设为  提问结束

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

(44.05 KB, 下载次数: 42)

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

1J]{BLQ5USJM0ET]MDY7IS0.jpg

作者: job    时间: 2014-4-12 21:36
杨庆雷 发表于 2014-4-12 21:34
图片右下角 编辑  进去后 改为提问结束

谢啦!终于找到了!
作者: 苍穹的雨    时间: 2014-4-13 14:31
一楼正解。。。
作者: 无此姓名    时间: 2014-4-13 18:25
  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取值范围了,还得用大数太麻烦,还占用资源
作者: Без_тебя    时间: 2014-6-12 22:21
你可以试着用很多数字去除余1000,是不是都是剩下最后的三位在而已
作者: 焦国军    时间: 2014-6-13 02:50
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循环。
还有就是我认为,你说的那两个方法代码都不够优化,尤其是第一个方法,本来一个简单的问题,你把它复杂化了。
以上是我的个人见解,不足之处,还请见谅!!!







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2