Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:1001总是通不过,请各位指教阿In Reply To:1001总是通不过,请各位指教阿 Posted by:initialsky at 2008-04-28 17:55:49 > 自己电脑上试了网页上的那几组数据都对的,可是上传上去就错了,不知道错在哪里了,想找出一组会出错误的数据来,怎么试阿。 > import java.util.*; > import java.lang.*; > > > public class Main > { > public static void main(String[] args) throws Exception > { > Scanner cin = new Scanner(System.in); > //读取底数(字符串) > String R; > //读取指数(字符串) > String n; > > while(cin.hasNext()){ > > //读取底数(字符串) > R = cin.next(); > //读取指数(字符串) > n = cin.next(); > //小数点位置 > int pointAt = 6; > //读取小数点位置,6个位中小数点只可能在从第1位到第4位上的一个位置上 > for(int i = 1;i<5;i++) > { > if(R.charAt(i)=='.') > { > pointAt = i; > break; > } > } > > //如果有小数点,就去掉小数点 > //如果pointAt不等于0,说明有小数点 > if(pointAt != 6) > { > String R1 = R.substring(0,pointAt); > String R2 = R.substring(pointAt+1,6); > R = R1 + R2; > } > //获取字符串的长度 > int len = R.length(); > //去掉最前面的0 > while(R.charAt(0)=='0') > { > R = R.substring(1 , R.length()); > } > //后面的0的个数 > int endNumZero = 0; > //去掉最后面的0 > while(R.charAt(R.length()-1)=='0') > { > R = R.substring(0 , R.length()-1); > endNumZero++; > } > > //申请两个数组用于运算,初始化数组为0 > int[] jieGuo1 = new int[178]; > int[] jieGuo2 = new int[178]; > for(int i=0;i<178;i++) > { > jieGuo1[i] = 0; > jieGuo2[i] = 0; > } > //把R转换成整形数组numR > int[] numR = new int[len]; > //把R转换成整数numberR > int numberR =Integer.parseInt(R) ; > for(int i=len-1;i>=0;i--) > { > numR[i] = numberR %10; > numberR = numberR/10; > jieGuo1[178 - len + i] = numR[i]; > jieGuo2[178 - len + i] = numR[i]; > } > //把n转换成整数numN > int numN =Integer.parseInt(n) ; > > /** > 计算,步骤(1)+步骤(2)共执行numN-1次,最后一次数组不用变0: > (1)把numR的每一位与jieGuo1相乘,分别加到jieGuo2中,jieGuo1变0; > (2)再把numR的每一位与jieGuo2相乘,分别加到jieGuo1中,jieGuo2变0; > (3)回到(1); > */ > > //相乘的次数xiangShu > int xiangShu = numN - 1; > //jieGuo1中数字的长度(不包括左边的0) > int len1 = len; > //jieGuo2中数字的长度(不包括左边的0) > int len2 = len; > //numR中的一位与jieGuo1或jieGuo2中的一位相乘的结果 > int weiNum; > > //指数numN为偶数,则乘奇数次,最终结果保存在jieGuo2中。 > //指数numN为奇数,则乘偶数次,最终结果保存在jieGuo2中。 > while(xiangShu > 0) > { > //j为奇数时,jieGuo1与numR相乘,结果保存在jieGuo2中。 > if(xiangShu % 2 == 1) > { > //jieGuo2清零。 > for(int i = 178-1;i >= 178-len2;i--) > { > jieGuo2[i] = 0; > } > //数字保存在数组的最右端,从右往左乘。 > for(int i = len-1;i >= 0;i--) > { > for(int j=0;j<len1;j++) > { > //numR的一位numR[i]与jieGuo1的一位jieGuo1[178-1-j]相乘 > weiNum = jieGuo1[178-1-j] * numR[i]; > //相乘结果加到jieGuo2中的相应项中(根据两个多位数相乘乘法运算的方法)。 > jieGuo2[178-1-j-(len-1-i)] += weiNum; > weiNum = jieGuo2[178-1-j-(len-1-i)]; > int k = j; > //不停地往上进位,直到不需要进位时 > while(weiNum > 9) > { > jieGuo2[178-1-k-(len-1-i)] = weiNum%10; > //最多进9(81+9)? > jieGuo2[178-1-k-(len-1-i)-1] += weiNum/10; > ++k; > weiNum = jieGuo2[178-1-k-(len-1-i)]; > } > } > } > > //求jieGuo2中保存的计算结果的长度:len2 > int numzero; > for(numzero = 0;jieGuo2[numzero] == 0;numzero++){} > len2 = 178 - numzero; > } > > //j为偶数时,jieGuo2与numR相乘,结果保存在jieGuo1中。 > if(xiangShu%2 == 0) > { > //jieGuo1清零。 > for(int i = 178-1;i > 178-1-len2;i--) > { > jieGuo1[i] = 0; > } > //数字保存在数组的最右端,从右往左乘。 > for(int i = len-1;i >= 0;i--) > { > for(int j=0;j<len2;j++) > { > //numR的一位numR[i]与jieGuo1的一位jieGuo1[178-1-j]相乘 > weiNum = jieGuo2[178-1-j] * numR[i]; > jieGuo1[178-1-j-(len-1-i)] += weiNum; > weiNum = jieGuo1[178-1-j-(len-1-i)]; > int k = j; > //往上进位 > while(weiNum > 9) > { > jieGuo1[178-1-k-(len-1-i)] = weiNum%10; > //最多进9(81+9) > jieGuo1[178-1-k-(len-1-i)-1] += weiNum/10; > ++k; > weiNum = jieGuo1[178-1-k-(len-1-i)]; > } > } > } > > //求len1 > int numzero; > for(numzero = 0;jieGuo1[numzero] == 0;numzero++){} > len1 = 178 - numzero; > } > --xiangShu; > } > > //输出计算结果 > /** > 如果是小数,则pointAt != 6,5-pointAt>0:5-pointAt为小数位数。 > endNumZero:如果有小数点(5-pointAt>0),去掉小数点后,右面0的个数 > 5-pointAt-endNumZero: > 如果大于0,就是R的有效小数位数, > 如果小于0,其相反数就是R的整数部分最右边0的个数, > 如果等于0,它原来小数部分都是0,R的整数部分最右边0的个数为0个 > */ > //小数个数或0的个数 > int pointOrZero; > //R为小数时,(如:50.230),5-pointAt-endNumZero=5-2-1=2>0;(如:50.000)5-pointAt-endNumZero=5-2-4=-1<0; > if(pointAt != 6) pointOrZero = 5-pointAt-endNumZero; > //R为整数时 > else pointOrZero = endNumZero; > > //R为整数时的结果 > if(pointAt == 6) > { > //numR中的数的指数运算结果(numR中保存的是R处理后的整数)。 > for(int i = 178-len2;i<178;i++) > { > System.out.print(String.valueOf(jieGuo2[i])); > } > //结果中最右边0的位数:outZeroNum > int outZeroNum = 0; > for(int i=1;i<=numN;i++) > { > outZeroNum += pointOrZero; > } > //输出最右边的0 > for(int i=0;i<outZeroNum;i++) > { > System.out.print('0'); > } > } > //R为小数时的结果 > //(1)小数部分不为0 的小数的结果 > else if(pointOrZero > 0) > { > //结果中小数位数:outPointNum > int outPointNum = 0; > for(int i=1;i<=numN;i++) > { > outPointNum += pointOrZero; > } > //当R为纯小数时(如:0.0100),178-outPointNum < 178-len2,下面的循环不执行。 > //当R不为纯小数时(如:1.0100),178-outPointNum > 178-len2,下面的循环输出整数部分 > for(int i = 178-len2;i<178-outPointNum;i++) > { > System.out.print(String.valueOf(jieGuo2[i])); > } > //输出小数点 > System.out.print('.'); > //输出小数部分 > for(int i = 178-outPointNum;i<178;i++) > { > System.out.print(String.valueOf(jieGuo2[i])); > } > } > //(2)小数部分是0(,整数部分最右边是0) 的小数(如:10.000)的结果 > else if(pointOrZero <= 0) > { > //结果中最右边0的位数:outZeroNum > int outZeroNum = 0; > for(int i=1;i<=numN;i++) > { > outZeroNum -= pointOrZero; > } > //numR中的数的指数运算结果(numR中保存的是R处理后的整数)。 > for(int i = 178-len2;i<178;i++) > { > System.out.print(String.valueOf(jieGuo2[i])); > } > //输出最右边的0 > for(int i=0;i<outZeroNum;i++) > { > System.out.print('0'); > } > } > System.out.print('\n'); > } > } > } > > Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator