现有这样一题:描述
给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
输入
第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开。1≤m≤100, 1≤n≤100。
之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
输出
一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。
样例输入
3 3
1 0 1
0 0 1
1 1 0
1 1 0
0 0 1
0 0 1
样例输出
44.44
我的源码是
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,a=0,mn;double s;
cin>>m>>n;
int jun1[m+1][n+1],jun2[m+1][n+1];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++) cin>>jun1[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++) cin>>jun2[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++){
if(jun1[i][j]==jun2[i][j]) a++;
}
mn=m*n;
s=a*100/mn;
cout<<s<<endl;
cout<<fixed<<setprecision(2)<<s<<endl;
}
为何我的结果是44.00?
因为第16右边式子是整数除法,小数被忽略了,可以在式子开头乘以1.0,将运算变为浮点数类型运算,以保留除法的小数结果;
然后将for循环中的m和n调换一下位置,因为m是行,n是列。
修改如下:
参考链接:
#include<bits/stdc++.h>
using namespace std;
int main(){
// https://www.luogu.com.cn/problem/B2103
int m,n,a=0,mn;double s;
cin>>m>>n;
int jun1[m+1][n+1],jun2[m+1][n+1];
// 将下面循环中的m和n调换一下位置,因为m是行,n是列
for(int i = 1;i<=m;i++)
for(int j = 1;j<=n;j++) cin>>jun1[i][j];
for(int i = 1;i<=m;i++)
for(int j = 1;j<=n;j++) cin>>jun2[i][j];
for(int i = 1;i<=m;i++)
for(int j = 1;j<=n;j++){
if(jun1[i][j]==jun2[i][j]) a++;
}
mn=m*n;
// 将式子乘以1.0,将运算变为浮点数类型运算,以保留小数结果
s=a*1.0*100/mn;
// cout<<s<<endl;
// https://wenku.csdn.net/answer/7638762f15ae4e96bcf6511ff995ce8f
cout<<fixed<<setprecision(2)<<s<<endl;
}
引用 皆我百晓生 小程序回复内容作答:
你的结果是44.00是因为你没有将s的类型设置为double型。
在代码中,你声明了s为double类型,但是在计算s的值时,使用了整数相除(mn是整数类型),结果为整数。然后再将这个整数赋值给s,所以s的小数位被截断了,因此s的值显示为44.00。
为了获得正确的结果,你可以将mn的类型改为double型,或者将s的类型改为int型。
以下是将mn的类型改为double型的修改代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,a=0; double s;
cin>>m>>n;
int jun1[m+1][n+1],jun2[m+1][n+1];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++) cin>>jun1[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++) cin>>jun2[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++){
if(jun1[i][j]==jun2[i][j]) a++;
}
double mn=m*n;
s=a*100/mn;
cout<<fixed<<setprecision(2)<<s<<endl;
}
然后运行代码,你将得到正确的结果44.44。
【以下回答由 GPT 生成】
解决方案的代码已经在上面给出了,解决方案的说明也已经在上面给出了。
【相关推荐】