hdu 1060 Leftmost Digit

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1060

思路很简单。就是二分求解。每次只去第一个数。

wrong 了很多次。很多细节没注意

对于log10()要把里面的数强制转化成double 或者float.

还有要把n要用__int64的。。开始觉得int型足够了。。但是好像 大于1亿的时候,在做乘的时候会超过int的范围。


#include<iostream>
#include<cmath>
using namespace std;
__int64 n;
int digit(__int64 x)
{
	return  log10((double)x);      //要强制转换。。不然有些编译器。不能通过
}
double solve(__int64 k)
{
	double sum;
	if(k==1)
	{
		return n/pow(10,digit(n));
	}
	else
	{
		double s=solve(k/2);

		s=s/pow(10,digit(s));

	//	printf("%lf\n",s);
		sum=(s*s);

		sum=sum/pow(10,digit(sum));

		if(k%2==1)
		{
			sum=sum*n;
	    	sum=sum/pow(10,digit(sum));
		}

	}
	return sum;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		scanf("%I64d",&n);

		double ans=solve(n);

		printf("%d\n",(int)ans);
	}
	return 0;
}

你可能感兴趣的:(hdu 1060 Leftmost Digit)