题目简要:
给定正整数B和N,找到一个整数A,使得AN尽可能接近B.(结果A是B的第N个根的近似值)。注意,AN可以小于,等于或大于 比B.
输入:输入由B和N的一对或多对值组成。每对出现在单个行上,由单个空格分隔。 指定B和N的值零的线标记输入的结束。 B的值在1至1,000,000(包括)的范围内,N的值在1至9(包括1和9)的范围内。
输出:对于输入中的每对B和N,如上定义的输出A本身在一行上。
例如:
Example Input: | Example Output: |
4 3 5 3 27 3 750 5 1000 5 2000 5 3000 5 1000000 5 0 0 | 1 2 3 4 4 4 5 16 |
解题思路:
这道题其实只需要解决开根号的问题就好了,将b开n次根,取到double型的a,然后在判断,哪一个是更接近的整数。
基本思路还是比较容易的,只是在一开始开根号是不知如何是好。不过后来发现其实开n次根,其实就是1/n次方,所以用pow直接就可解决。
附代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int>s;
int A1,A2,b,n,i;
double a;
while(cin>>b>>n&&b!=0&&n!=0)
{
a=pow(b,1.0/n);
A1=a;
A2=a+1;
if(fabs(b-(pow(A1,n)))>fabs(b-(pow(A2,n))))
s.push_back(A2);
else
s.push_back(A1);
}
for(i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
}
return 0;
}
using namespace std;
int main()
{
vector<int>s;
int A1,A2,b,n,i;
double a;
while(cin>>b>>n&&b!=0&&n!=0)
{
a=pow(b,1.0/n);
A1=a;
A2=a+1;
if(fabs(b-(pow(A1,n)))>fabs(b-(pow(A2,n))))
s.push_back(A2);
else
s.push_back(A1);
}
for(i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
}
return 0;
}
解题感受:
这是我第一次一次提交就A,感觉很兴奋,收获就是需要拓展思维,不能拘泥。要习惯从多个角度看问题。这是3月10号的第一道题,其实已经晚上11点了·····由于白天满课实在没有时间,只好晚上打了···