好代码和坏的代码的区别就在于,好的代码能够使用更短的时间,更少的内存,做和平庸的代码一样的事情。但是个人觉得,未来更好的硬件出来之后,写好代码和坏代码对于结果的影响越来越小,好代码是否还有意思(又跑题了)。本次编程题是Pixel第一次在笔试中AC,哈哈哈没有理由不记录一下。
题目描述,给定两个整形A和B,求得A^B结果的最后三位数并以字符串形式返回。直接用Pow函数会不会产生一些问题,这个我没有实验过。相似的LeetCode题目还有字符串相乘。代码我的注释也写的很详细的。直接看好了。
public class Main { public static void main(String[] args) { System.out.println(tailOfPower(2,3)); } // 问题描述:给定整型a和整形b,求得a^b的后三位,以字符串形式返回 // 问题思路:假设a*b=c,那么c的最后三位仅和a的最后三位和b的最后三位相关,且可以使用乘法运算计算,计算描述如下: // // 假设求135 * 246 ,想获得结果后三位h,i,j,运算公式如下 // // 1 3 5 // * 2 4 6 // ------- // a b c // e f // g // ------- // h i j // // 可以得出j=c=5*6=30 的个位,即0,且向十位进位,进3 // i=b+f+个位进位=3*6+4*5+3=41的个位,即1,且向百位进位,进4 // h=a+e+g+十位进位=1*6+4*3+2*5+4=32的个位,即2 // 得到最后三位210. public static String tailOfPower(int a,int b){ //将A的最后三位保存,由整型数组接收,其中索引0为百位,索引1为十位,索引2为个位 int[] arrTail=new int[3]; //整形数组第一位保存百位数 arrTail[0]=(a/100)%10; //整形数组第二位保存十位数 arrTail[1]=(a/10)%10; //整形数组第三位保存个位数 arrTail[2]=a%10; //第一次相乘是A乘以A,故输入为A后三位 int[] input=arrTail; //共循环b-1次,因为第一次是A*A所以一共计算B次 for (int i = 0; i < b-1; i++) { //定义输出的三位数 int[] output=new int[3]; //定义个位向十位的进位 int JWG=0; //计算c(如前公式所示) int numG=input[2]*arrTail[2]; //若c大于0则计算进位 if(numG>10){ JWG=numG/10; } //保存c的个位为输出的个位 output[2]=numG%10; //懒得写了,计算十位数和向百位的进位 int JWS=0; int numS=input[1]*arrTail[2]+input[2]*arrTail[1]+JWG; if(numS>10){ JWS=numS/10; } output[1]=numS%10; //计算百位数,这里不计算进位了 int numB=input[0]*arrTail[2]+input[1]*arrTail[1]+input[2]*arrTail[0]+JWS; output[0]=numB%10; //debug代码,请忽略>_< //for (int i1 = 0; i1 < output.length; i1++) { // System.out.print(output[i1]); //} //System.out.println(); //将计算出的三位数字保存,下一次就将这三位数作为输入和A的后三位计算了 input=output; } //将数组写成字符串形式,后返回 String s=""+input[0]+input[1]+input[2]; return s; } }
该算法最终获得100%通过。
原文:https://www.cnblogs.com/PixelShine/p/12580615.html