| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 646 人关注过本帖, 1 人收藏
标题:每日一个简单程序之HDU2016
只看楼主 加入收藏
showsadd
Rank: 1
来 自:武汉
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-3-18
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:5 
每日一个简单程序之HDU2016
最近有点乱,工作上不是很轻松,所以学习和刷题的进度奇差无比,好不容今天做了个题目,一直提示,输出格式错误,
Problem Description
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
Sample Input
4 2 1 3 4
5 5 4 3 2 1
0
Sample Output
1 2 3 4
1 4 3 2 5
那么聪明的各位,能帮我纠正下我的代码中的问题吗
程序代码:
#include<stdio.h>
int main()
{
    int n,i,temp,m=0,a[99],min;
    while(scanf("%d",&n))//很多人都写//while(scanf("%d",&n),n),我不懂这是什么意思,求教
    {
        if(n==0)
            break;//输入的n为0时,直接结束程序
        scanf("%d",&a[0]);//给数组第一元素a[0]赋值,用于后期比较
        min=a[0];//将a[0]设为最小值先
        for(i=1;i<n;i++)
        {
            scanf("%d",&a[i]);//i设初值为1,这样是从数组第二个元素开始输入
            if(a[i]<min)
            {
                m=i;
                min=a[m];    //比较过程,将i这这个过程中的值,标记为m,因为for循环有个奇怪的地方,
                            //当i判断小于n,比如n=5的时候,i在为4时退出循环,但是i++这个表达式把i++的
                    //的值储存了下来,所以,在跳出循环使用i,i就编程5,而不是你想要的那个4,或者其他
            }
        }
        temp=a[0];           //转换过程,将标记的最小的数值与a[0]交换
        a[0]=a[m];           //
        a[m]=temp;           //
        for(i=0;i<n;i++)
            printf("%d",a[i]);//输出数组就可以了
       
        m=0;       //这里的话,有个小陷阱,比如你输入n=5,然后分别输入,1,2,3,4,5;
                 //他会输出一个正确的排序,即1,2,3,4,5,
               //而如果你输入n=5,然后输入,2,1,3,4,5,那么此时的m,即为1,元素a[1];
             //当你下次再输入n=5,然后1,2,3,4,5,的时候,m=1被储存了下来,输出就成了2,1,3,4,5,
        //故,m在每次结束循环时,归0;
       
    }
}
代码我自己精简了半天,而且我认为比网上AC的答案要容易懂,注释很多,希望大家能快些看懂,帮我解决这个问题,谢谢各位。
2013-05-04 23:20
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
额,开始看错了,以为你的 a[0]存储个数。。。。。。

错误提示是 格式错误,很明确了,输出格式不对,数据间要有空格隔开

[ 本帖最后由 azzbcc 于 2013-5-4 23:37 编辑 ]


[fly]存在即是合理[/fly]
2013-05-04 23:33
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:5 
 while(scanf("%d",&n))//很多人都写//while(scanf("%d",&n),n),我不懂这是什么意思,求教


我对 "," 还不太理解,
一般写成
while((scanf("%d", &n)) == 1 && n)


首先得到n的值,再判断n是否为0 ,0 就是假,while不会继续执行,非0为真,进入循环

这样写就不用下面判断n == 0 了吧?

[ 本帖最后由 Ryker 于 2013-5-5 11:31 编辑 ]
2013-05-05 11:29
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:5 
非0为真
...非0继续,0终止

仰望星空...........不忘初心!
2013-05-05 11:35
showsadd
Rank: 1
来 自:武汉
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-3-18
收藏
得分:0 
回复 3楼 Ryker
这个是我要的回答之一,谢谢
2013-05-05 12:09
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:5 
while(scanf("%d",&n),n)
这样不好,这么写是根据n来判断结束条件,先用scanf读取值给n,然后判断n的真假,这只适用于以n的真假来作为结束条件的情况,而且最好先初始化n为0,要不然如果输入的不是数字就麻烦了
2013-05-05 12:13
快速回复:每日一个简单程序之HDU2016
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024862 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved