【hustoj注意事项】函数返回值问题
原文
https://lg.h-fmc.cn/index.php/BC/27.html
问题回顾
此题目选自HFMC_OJ:4312: 简单递归操作
hustoj测试
此问题错误的代码是
#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
int pailie(int deep)
{
int i;
for(i=1;i<=n;i++)
{
if (b[i]==0)
{
a[deep]=i; b[i]=1;
if(deep<n)
pailie(deep+1);
else{
for(int j=1;j<=n;j++)
cout<<a[j]<<" ";
cout<<'\n';
}
b[i]=0;
}
}
}
int main()
{
cin>>n;
pailie(1);
return 0;
}
提交到hustoj的返回是
CCR Plus测试
代码同样:
#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
int pailie(int deep)
{
int i;
for(i=1;i<=n;i++)
{
if (b[i]==0)
{
a[deep]=i; b[i]=1;
if(deep<n)
pailie(deep+1);
else{
for(int j=1;j<=n;j++)
cout<<a[j]<<" ";
cout<<'\n';
}
b[i]=0;
}
}
}
int main()
{
cin>>n;
pailie(1);
return 0;
}
测评之后的返回是
测试数据 testdata
点我下载:P4312_Testdata.zip
问题解析回顾
首先,可以得出要么是hustoj的问题,要么是ubuntu的问题,于是,我们使用宝塔Linux面板编译了代码,视频如下
https://lg.h-fmc.cn/usr/uploads/2025/01/3108223426.mp4
从上视频最后一帧可以看出,是第23行关于return有一定的关系。
23行是}
,于是,我们截取了整个子程序
int pailie(int deep)
{
int i;
for(i=1;i<=n;i++)
{
if (b[i]==0)
{
a[deep]=i; b[i]=1;
if(deep<n)
pailie(deep+1);
else{
for(int j=1;j<=n;j++)
cout<<a[j]<<" ";
cout<<'\n';
}
b[i]=0;
}
}
}
根据计算机程序设计基本尝试,我们可以知晓
子函数返回类型规则
int 整型
long long 长整型
char 字符型
string 字符型
double 双精度浮点型
float 单精度浮点型
void 无返回
注意看void,如果子函数的类型是void,则可以不需要return,但是上述代码的类型是int,也就是说,必须要返回一个整型,但是程序没有返回整型,所以出现了运行时错误
调整代码并重新测试
已知问题,那么我们就可以修复代码
修复方法1:修改类型int为void
#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
void pailie(int deep)
{
int i;
for(i=1;i<=n;i++)
{
if (b[i]==0)
{
a[deep]=i; b[i]=1;
if(deep<n)
pailie(deep+1);
else{
for(int j=1;j<=n;j++)
cout<<a[j]<<" ";
cout<<'\n';
}
b[i]=0;
}
}
}
int main()
{
cin>>n;
pailie(1);
return 0;
}
修复方法2:返回0
#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
int pailie(int deep)
{
int i;
for(i=1;i<=n;i++)
{
if (b[i]==0)
{
a[deep]=i; b[i]=1;
if(deep<n)
pailie(deep+1);
else{
for(int j=1;j<=n;j++)
cout<<a[j]<<" ";
cout<<'\n';
}
b[i]=0;
}
}
return 0;
}
int main()
{
cin>>n;
pailie(1);
return 0;
}
提交代码
提交代码后,hustoj返回
Linux重新编译
已经编译成功,代码运行后正确
问题:为什么Windows下运行不会报错?
我们注意一下Linux的编译指令:-std=c++17
如果在Windows加上-std=c++17
,那么一般会直接编译错误
因为Windows上的版本是C++11
,如果是C++17
,那么同样会报错
我们应该怎样做
1.严格遵守程序设计规则