hiho1234--Fractal(高精度)

题目大意:给一个正方形,然后取各边的中点,连接成一个新的正方形,每次在新的正方形中重复此过程,共1000次。最后给出一条平行与y轴的线,问经过多少条边。


分析:规律蛮好找的,思路蛮好想的。然而,精度的问题,还是用Java好了。这是第一次用Java写,所以,参考了下别人的代码,传送门:http://www.cnblogs.com/qscqesze/p/4824212.html
这个是UESTC卿神的博客。Orz...


代码:

import java.math.BigDecimal;
import java.util.Scanner;



public class Main
{
    static BigDecimal a[] = new BigDecimal[1005];
    public static void main(String argv[]) throws Exception
    {
    	Scanner scanner = new Scanner(System.in);
    	BigDecimal x = BigDecimal.valueOf(0.5);
    	BigDecimal k = BigDecimal.valueOf(0.5);
    	BigDecimal y;
    	a[0] = BigDecimal.valueOf(0);
    	for(int i = 1; i <= 500; i++)
    	{
    		x = x.multiply(k);
    		a[i] = a[i-1].add(x);
    	}
    	int T = scanner.nextInt();
    	while(T != 0)
    	{
    		int L = 0, R = 500;
    		y = scanner.nextBigDecimal();
    		while(L <= R)
    		{
    			int mid = (L+R)/2;
    			int result = a[mid].compareTo(y);
    			if(result == -1) L = mid+1;
    			else if(result == 1) R = mid-1;
    			else
    			{
    				L = mid;
    				break;
    			}	
    		}
    		if(a[L].compareTo(y) == 0) System.out.println(-1);
    		else System.out.println(L*4);
    		T--;
    	}
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值