求助大佬一道pta的题,小L的难题

ShiroEmiya 2020-10-18 05:51:54

本人拙劣的代码
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int factorial(int a) //阶乘函数
{
int b=1;
if(a==1||a==0)
return b;
if(a>=2)
{
b=a*factorial(a-1);
return b;
}
if(a<0)
return 1;
}
int cn(int n,int k) //组合数函数
{
return factorial(n)/(factorial(k)*factorial(n-k));
}
int main()
{
int n,i=0,I,xb=0;
cin>>n;
int a[n];
int Cna=cn(n,2); //计算出所有的可能
int b[Cna]; //用一个数组承接所有可能的差值
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n-1;i++) //计算所有出现的差值
{
for(I=i+1;I<n;I++)
{
b[xb]=abs(a[i]-a[I]);

xb++;
}

}
sort(b,b+Cna); //快排
cout<<b[1]; //输出第二小
return 0;
}

运行之后显示是浮点错误但是答案正确,求大佬解惑。
...全文
160 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-10-19
  • 打赏
  • 举报
回复
给你个写个例子吧

int main() {
int n, i, j, tmp, min1=0x7FFFFFFF, min2=0x7FFFFFFF, *a;
scanf("%d", &n);
a = (int*)malloc(sizeof(int)*n);
for(i=0; i<n; i++) scanf("%d", &a[i]);
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
tmp = abs(a[i]-a[j]);
if (tmp<min2) min2=tmp; //如果差小于第二小,则保存为第二小
if (min2<min1) { //如果第二小小于第一小,则互相交换(也就是第一小始终保持最小)
tmp = min2;
min2 = min1;
min1 = tmp;
}
}
}
printf("第一小: %d, 第二小: %d\n", min1, min2);
free(a);
return 0;
}
  • 打赏
  • 举报
回复
没必要求组合,C(100000, 2)接近50亿,太占空间,运算也太慢,直接把输入数据排序,遍历一遍就可以了
ShiroEmiya 2020-10-19
  • 打赏
  • 举报
回复
引用 1 楼 qybao的回复:
这个阶乘有问题,会超出int范围 其实没必要用数组,只要两个变量,一个记录最小差值,一个记录第二小差值就可以了,这样就没必要计算阶乘了
哦哦,谢谢大佬
qybao 2020-10-18
  • 打赏
  • 举报
回复
这个阶乘有问题,会超出int范围 其实没必要用数组,只要两个变量,一个记录最小差值,一个记录第二小差值就可以了,这样就没必要计算阶乘了

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧