<MEMORY>Project Euler NO40

本文介绍了一个有趣的数学挑战,即求解由连续正整数组成的无理小数中特定位置的数字乘积。通过自定义算法,程序能够高效地计算出小数点后1、10、100、1000、10000、100000及1000000位数字的乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将正整数连接起来可以得到一个无理小数:

0.123456789101112131415161718192021...

可以看出小数部分的第12位是1。

如果用dn表示这个数小数部分的第n位,找出如下表达式的值:

d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000




public class Problem40
{
	public static void main(String[] args)
	{
		long start = System.currentTimeMillis();
		System.out.print("answer:  ");
		
		howmany();
		
		long end = System.currentTimeMillis();
		System.out.print("time:  ");
		System.out.println(end - start);
	}
	
	static void howmany()
	{
		num(1);
		int mul = 1;   //1的时候
		
		//10  100 ......
		for (int i = 1; i <= 6; i++)
		{
			mul *= num ((int)(Math.pow(10, i)));
		}
		System.out.println(mul);
	}
	
	// n位数    一共有几个数字
	static int weishu(int n)
	{
		int t = (int)Math.pow(10, n - 1) * 9;
		
		return t * n;
	}
	
	//获得所需要的    数
	static int num(int n)
	{
		int sum = 0;
		int temp = 0;
		int i = 1;
		for (; (temp = weishu(i) + sum) < n; i++)
		{
			sum = temp;
		}
		
		int shang =  (n - sum) / i;			//商
		int yu = (n - sum) % i;				//余数
		
		int an =(int)Math.pow(10, i - 1) + shang;//得到数在哪个大数中, 用余数来取得数
		
		String a = "";
		if(yu == 0)
		{
			a = (an + "").substring((an + "").length() - 1);
		}
		else
		{
			a = (an + "").substring(yu - 1,yu);
		}
		
		return Integer.parseInt(a);
	}
	
}



answer:  210
time:  1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值