#include
#include
#include
using namespace std;
const int N=1e5+20;
long long x[N],y[N],r[N];
long long a[20],b[20];
long long z[20],n;
int main()
{
scanf('%lld',&n);
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i]>>r[i];
for(int i=1;i<=10;i++)
{
cin>>a[i]>>b[i];
z[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=10;j++)
if (( (a[j]-x[i])(a[j]-x[i]) + (b[j]-y[i])(b[j]-y[i]) )<r[i]*r[i])
{
z[j]++;
}
}
double ans=0;
for(int i=1;i<=10;i++) ans+=z[i];
printf('%.2lf',ans/10.0);
return 0;
}
该代码用于计算圆形区域内点的数量。
代码中存在以下错误:
- 第 7 行应该是
scanf('%lld',&n);,因为 n 是 long long 类型。
- 第 18 行的循环条件应该是
j<=10,而不是 i<=10。
- 第 19 行中的
i 应该改成 j,即 if (( (a[j]-x[i])*(a[j]-x[i]) + (b[j]-y[i])*(b[j]-y[i]) )<r[i]*r[i])。
- 第 24 行应该是
printf('%.2lf',ans/10.0);,因为要输出小数。
修改后的代码如下:
#include
#include
#include
using namespace std;
const int N=1e5+20;
long long x[N],y[N],r[N];
long long a[20],b[20];
long long z[20],n;
int main()
{
scanf('%lld',&n);
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i]>>r[i];
for(int i=1;i<=10;i++)
{
cin>>a[i]>>b[i];
z[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=10;j++)
if (( (a[j]-x[i])(a[j]-x[i]) + (b[j]-y[i])(b[j]-y[i]) )<r[i]*r[i])
{
z[j]++;
}
}
double ans=0;
for(int i=1;i<=10;i++) ans+=z[i];
printf('%.2lf',ans/10.0);
return 0;
}
代码解释:
scanf('%lld',&n);:使用 scanf 函数输入 long long 类型的 n。
for(int j=1;j<=10;j++):循环遍历 10 个圆形区域。
if (( (a[j]-x[i])*(a[j]-x[i]) + (b[j]-y[i])*(b[j]-y[i]) )<r[i]*r[i]):判断点是否在圆形区域内。
z[j]++;:如果点在圆形区域内,则计数器 z[j] 加 1。
printf('%.2lf',ans/10.0);:输出圆形区域内点的数量,保留两位小数。