Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:1001总是通不过,请各位指教阿

Posted by zibing at 2008-05-03 23:22:59 on Problem 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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator