c语言一道很简单的题,但代码运行了多次都正确,一题交就错,求一个代码,谢谢
刚开始学吗?没关系,慢慢来。
首先,几点建议与纠正:
在网上求助时,尽量将代码复制过来,方便别人调试。最好再注上错误信息(如果OJ上有的话)。
的源文件拓展名是.cpp,一般认为是C++的源文件(DEV也这样认为)。
代码写好缩进(一般使用Tab),这样更加美观,也能更好地看出程序的结构,等代码写得长了你就能明白它的重要性了。用空行将不同区块分开。加一些空格……可以搜索一下代码风格,自己喜欢怎么写就怎么写;
作为for循环时用作循环结束判断的(不需要在循环之外使用的,比如你的i和j)可以在for中定义(如下)这样,i的作用域就只有这个for循环。
数组开的大一些(一般大10个),且不使用第“0”个元素,循环时计数的变量也从1开始,i<=n,毕竟这点浪费很小,而且这样可以避免很多错误(用数组下标模拟指针的话,通常把0当作空;循环中这个计数变量是几就是第几次循环,数组下标是几就是第几个元素……)
在C++中头文件尽量使用cstdio代替stdio.h,它对stdio.h做了一些额外的工作,据说比stdio.h好一些(不容易出错)。但要使用C++库(cstdio、iostream、cmath等)时尽量在函数名前加上namespace::(C++库都用std),或者在程序开头加上using namespace std;
如果你写C,请尽量将拓展名改为.c
for(int i=1; i<=n; ++i)
其他变量也不要一股脑全部定义在一起;
错误更正:
你的思路应该是:①输入;②枚举,如果和下一个一样就变为0;③把0去掉;④冒泡排序;⑤输出;
如果相同的数字不挨着呢(尽管样例中相同数字挨着,但题面并没有说),比如:5 9 2 5 5,只有倒数第二个5会被删掉,因此应该先排序,①④②③⑤;
②③⑤可以合并,输出时判断当前这一个和下一个是否相等,不相等则输出;
代码如下:
#include <cstdio>
using namespace std;
int n,a[1000+10];
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d",&a[i]); //输入
for(int i=1; i<=n; ++i) //冒泡排序
for(int j=1; j<=n-i; ++j)
{
if(a[j]>a[j+1])
{
int tmp = a[j+1];
a[j+1] = a[j];
a[j] = tmp;
}
}
for(int i=1; i<=n; ++i)//输出
if(a[i] != a[i+1]) printf("%d ",a[i]); //当 i==n 时,由于我们多申请了一些空间,所以不会越界;a[i+1]没有赋值,由于a数组是全局变量,所以a[i+1]的值为0,因为输入不会有0,所以条件一定成立。
return 0;
}
其他解法(如果你是为了练习冒泡排序,请忽略):
计数排序,记录每个数字出现的次数,这里因为要去重,可以指记录每个数字是否出现。
参考代码:
#include <cstdio>
using namespace std;
int n;
bool a[1000+10];//记录每个数字是否出现过
int main()
{
scanf("%d",&n);
for(int i=1, in; i<=n; ++i)//输入并将这个数字标记为出现过
{
scanf("%d",&in);
a[in]=true;
}
for(int i=1; i<=1000; ++i)//如果出现过,输出
if(a[i])printf("%d ",i);
return 0;
}