天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

编写一递归函数将一根整数n转换成字符串,例如输入482,应输出字符串“482”。n的位数不确定,可以是任意位数的整数。

代码测试通过:

#include<stdio.h>
#include<string.h>
void IntToStr(int n);
char str[80]={0};
int main()
{
    int num;
    printf("input an integer number: ");
    scanf("%d",&num);
    IntToStr(num);
    printf("The string is: %s\n",str);
    return 0;
}

void IntToStr(int n)
{
    int i;
    if(n == 0)
        return;
    for(i=strlen(str)-1;i>=0;i--)
        str[i+1]=str[i]; //向后移一位
    str[0]=n%10+0x30; //最开始输入的数字最后一位放在str[0],随后向后移,直到n==0 
    IntToStr(n/10); //n不断取除个位的其他高位数
}




    

posted @ 2012-08-12 09:58 hoshelly 阅读(827) | 评论 (0)编辑 收藏

输入若干个单词,输出它们的平均长度。单词只包括大写字母和小写字母,用一个空格隔开。

代码测试通过:

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1000];
    char *p;
    p=&s[0];
    int len=0,tot=0,ws=0,per_len,i;
    gets(s);
    len=strlen(s);
    for(i=0;i<=len;i++)
    {
        if( *p >='a' && *p<='z' || *p >='A' && *p<='Z')
        {
            tot++;
            p++;
        }

        else if( *p == ' ' || *p =='\0')
        {
            ws++;
            p++;
        }
    }

    per_len=tot/ws;
    printf("%d\n",per_len);

    return 0;
}

posted @ 2012-08-11 23:11 hoshelly 阅读(565) | 评论 (0)编辑 收藏

输入正整数n<=20,输出一个n层的倒三角形,例如n=5时输出如下:

#########
  #######
    #####
      ###
        #

代码测试通过:

#include<stdio.h>
int main()
{
    int n,s,i,j,k,c=0;
    scanf("%d",&n);
    s=2*n-1;
    for(i=0;i<n;i++)
    {
          if(c!=0) //如果不是第一行,即s要减2,作为输出#的个数
              s=s-2;
          for(k=0;k<c;k++)
          {
            printf(" ");
          }
          for(j=0;j<s;j++)
          {
            printf("#");
          }
          for(k=0;k<c;k++)
          {
              printf(" ");
          }
          c++;
        

        printf("\n");
    }
    return 0;
        
}
        

posted @ 2012-08-10 20:24 hoshelly 阅读(448) | 评论 (0)编辑 收藏

删数问题
时间限制:1000 ms  |  内存限制:65535 KB
描述

           给出一个N位正整数(首位不为0),去掉其中S个数字后剩下的数字按左右次序组成一个新的N-S位正整数(首位不能为0)。对给定的N和S,寻找一种删数规则使得剩下得数字组成的新数最小。

输入
         第一行一个正整数T ,表示有T组测试数据。

        对于每组测试数据:第一行两个正整数 n ,s (s<  n <= 10, 000) (用空格隔开); 第二行为一个n 位正整数。

输出
         对于每组测试数据输出一行:最小的新数。

样例输入
2
10 2
1234334789
11 3
90019008798
样例输出
12333478
19008798

代码:

#include<stdio.h>
int main()
{
    int t,n,s,i,j,c=0;
    char str[1200];
    char *p,*sp;
    scanf("%d",&t);
    while(t--)
    {
        i=0;
        scanf("%d%d",&n,&s);
        scanf("%s",str);
        p=&str[0];
        sp=&str[1];
        while(*sp !='\0')
        {
            if(str[0] =='0')
            {
                for(j=0;j<n-c;j++)
                {
                   str[j]=str[j+1];
                }
                c++;
            }
            if(*p == str[0] && *p > *sp)
            {
                for(j=0;j<n-c;j++)
                {
                   str[j]=str[j+1];
                }
                i++;
                p++;
                sp++;
                continue;
            }
            for(;*p > *sp;*p--,*sp--)
            {
                if(c != s)
                {
                  for(j=i;j<n-c;j++)
                  {
                     str[j]=str[j+1];
                  }
                  i--;
                  c++;
                }
            }
          if(c != s && str[0] !='0')
          {
            p++;
            sp++;
            i++;
          }
           if(c == s)
           {
               break;
           }
        }

        for(i=0;i<n-s;i++)
        {
            printf("%c",str[i]);
        }
        printf("\n");
    }

    return 0;
}

posted @ 2012-08-10 11:44 hoshelly 阅读(1047) | 评论 (0)编辑 收藏

我们学习Linux的时候势必要学习一大堆对于大部分正常人来说枯燥无比的命令行,因为是第一次尝试在一个黑箱子里面敲一串一串不熟悉的命令,可以理解的啦。现在我总结出一些Linux中比较常用的命令行。

一)列出文件:ls ,如果要列出本目录下的文件属性呢,例如想知道他们的文件权限、大小、日期,那么就用 ls -l ,也可用其命令别名 ll 。
                   我们都知道Linux中都有一些隐藏的文件,那么如何显示出它们呢?用 ls -a 即可显示出所有文件,包括隐藏文件。要列出这些文件的属性,用 ls -al 
                   列出目录用:ls -d
                   如果我们想找出一个特定的文件如file 的信息,那么可以用ls  -l file ,又如要寻找一个前缀为test的文件的信息,可以这样:ls -l test*,*为通配符。
                   如果我们想找出文件名中带有数字或字母的相关文件,可以这样 : ls -f [0-9]* / ls -f [a-z]*

二)打开文件或目录:如想打开名为 file.txt文件,用cat file.txt即可显示出内容。如想把文件内容的行号显示出来,用 cat -n file.txt 即可 ;打开目录tmp 则用 cd tmp

三)复制文件: 如想把文件file.txt 复制到目录 /test 下,即可用:cp file.txt /test ;如想把目录 /etc/ 的所有内容复制到 /tmp,用:cp /etc/ /tmp

四)删除文件或目录:如想删除文件file.txt 则可: rm file.txt 。如想把目录tmp(包括有内容的目录)都删除掉,用 rm -rf tmp ,而 rmdir tmp 删除的是一个空目录。

五)移动文件或重命名:如把文件file.txt移动到目录tmp中: mv file.txt tmp 。把文件file.txt重命名为 test.txt,则可: mv file.txt test.txt

六)翻页查看命令:1. 如想查看/etc/中的文件man.config,可 more /etc/man.config ,敲空格键表示向下翻一页;Enter表示向下翻“一行”;/字符串可以向下搜索字符串:如搜索word,可以 /word ;离开more 可以用 q ;2. 也可用 less 进行翻页操作:less /etc/man.config ,使用less可以向前或向后翻页,而more只能向后翻页;?字符串表示向前搜索的功能,其他操作和more 大体相同。

七)创建新文件或目录 : 如创建新文件 test.txt 可以: touch test.txt ;创建目录abc,用命令:mkdir abc . 如果我们要创建一个名为junk.data ,大小为1M,内容为空的文件,该怎么办呢?可以使用命令: dd if=/dev/zero of=junk.data bs=1M count=1 即可,其中dd是用来创建特定大小文件的命令,dd命令会克隆给定的输入内容,然后将一模一样的一份副本写入到输出,stdin、设备文件、普通文件都可以作为输入. if 代表输入文件, of 代表输出文件, bs代表以字节为单位的块大小,count代表要被复制的块数。

八)改变文件的权限: 1. 使用符号方法改变文件权限:在此之前了解下who /action 的知识,u表示属主、g表示组、o表示其他、a表示所有;+表示增加文件权限、-表示减少文件权限、=明确地设置文件权限。好了,如果现在我们想把一个目录下的所有文件都改变为对所有人均可访问,则可用命令:chmod a=r * (或chmod guo=r *),注意空格。
如果想阻止除了文件属主之外的任何人写文件 test.txt ,可用命令: chmod go-w test.txt 
2. 使用八进制方法改变文件权限:r=4,w=2,x=1. 把各个想要赋予的权限值相加即可得到用来指定文件属主、组和其他用户对文件的权限。 如:对文件test.txt 改为对所有均有读、写、执行的权限:chmod 777 test.txt

九)改变文件属主和组: 1. 改变文件属主:如把文件test.txt 改变为 zlb 所属有,则可 chown zlb: test.txt ,冒号不能省略。 2. 改变文件所属的组:可以用1中 chown :authors test.txt 改变文件test.txt所属的组;也可以用 chgrp authors test.txt 改变文件为authors这个组所有。


posted @ 2012-08-02 11:49 hoshelly 阅读(203) | 评论 (0)编辑 收藏

shell是和unix系统交流的语言,它是unix系统的工具,利用它可以来和操作系统的核心功能进行交互。
1)两种模式:交互式和非交互式Shell;所谓交互,即用户编写shell命令行来和操作系统交互。而在非交互模式下,不需要用户直接敲命令行,而是通过shell读命令之后,(就存在文件里),然后再执行,当文件结束的时候,就退出。
2)启动交互式shell:$ /bin/bash
                            bash$
第一个$是登陆系统时就有的,第二个bash$是由用户启动的Shell来显示的。这样一来就有了两个交互式的shell,可以用来测试之用。退出第二个shell可用命令:
exit,然后就会回到原先的shell。
3)启动非交互式shell:$ /bin/sh filename
这里的filename指的是可执行的文件,比如用shell写  echo 'hello world!' 放在一个命名为hello的文件里,要执行它的时候,就要用到命令 /bin/sh hello
4)基本命令行总结如下:
$ ls :列出当前目录的内容;
$ ls -a :列出当前目录包括不可见文件的内容;
$ man ls :获取关于ls命令的有关信息;注:不懂的命令要及时找man
$ cat [filename] :查看文件的内容
$ wc files :获取文件内容的行、单词和字符的数目;
$ wc -l file :统计行数
$ wc -w file: 统计单词
$ wc -m file: 统计字符
$ cp src dest :拷贝文件;src:被拷贝文件 、dest:拷贝到的目录
$ mv src dest :更改文件名
$ rm file :删除文件
$ ls dir :列出目录
$ mkdir dir :创建目录dir
$ cp -r src dest : 拷贝文件和目录; src:拷贝文件的目录的路径、dest:拷贝被放置的目录的路径
$ mv src dest :移动目录
$ rmdir dir:删除目录dir(内容为空的)
$ rm-r dir: 删除目录dir及其内容(无论内容是否为空)

好了,先介绍这些,以后会陆续更新。

posted @ 2012-06-09 02:47 hoshelly 阅读(213) | 评论 (0)编辑 收藏

掌握Linux学习方法学好Linux
如果你爱好学习知识,尤其是Linux操作系统知识,随着Linux应用的扩展,许多朋友开始接触Linux,可你不知道去哪里找到这些知识,来这里,让你更加了解Linux学习方法。让你全面掌握Linux学习方法。

1.学习的目的

通过Linux的学习掌握UNIX的目的想必不用多说了,在这个网络人才身价倍增的年代,想靠技术吃饭又不想掌握网络和编程技术是不明智的。当人们第一次听说Linux并跃跃欲试的时候,总会提出几个?,它是什么(What)?为什么要用它(Why)?怎样学习它(How)?作为开放源码运动的主要组成部分,Linux的应用越来越广泛,从我们平时的娱乐、学习,到商业、政府办公,再到大规模计算的应用。为了满足人们的需求,各种各样的、基于Linux的应用软件层出不穷。只要具备了LinuX的基本功,并具有了自学的能力之后,都可以通过长期地学习予以掌握。

2.从命令开始、从基础开始

常常有些朋友一接触Linux就希望构架网站,根本没有想到要先了解一下Linux的基础。这是相当困难的。虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平这个原理是不会变的。Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。这里笔者把它们中比较重要的和使用频率最多的命令,按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习,我们可以进一步理解Linux系统。

3.选择一本好的Linux书籍

无论在论坛还是读者反馈中,我们看到最多的问题往往是某个新手,在安装或使用Linux的过程中遇到一个具体的问题就开始提问,很多都是重复性的问题,甚至有不少人连基本的问题描述都不是很清楚。这说明很多初学Linux的人还没有掌握基本功。怎样才能快速提高掌握Linux的基本功呢?最有效的方法莫过于学习权威的Linux工具书,工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于Linux的书籍有很多不过精品的不多,笔者强烈建议阅读影印本的o'reilly原版Linux图书http://www.oreilly.com.cn/,而且出版社还提供了一个非常好的路线图:linux.php">http://www.oreilly.com.cn/guide/guide_linux.php

4.养成在命令行下工作的习惯

一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,你未来的学习之路将是以指数增加的方式增长的。对网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外的远程系统。 5.用UNIX思维思考Linux

由于Linux是参照UNIX的思想来设计的,理解和掌握它就必须以Unix的思维来进行,而不能以Windows思维。不可否认,Windows在市场上的成功很大一部分在于技术思想的独到之处。可是这个创新是在面对个人用户的前提下进行的,而面对着企业级的服务应用,它还是有些力不从心。多年来在计算机操作系统领域一直是二者独大:UNIX在服务器领域,Windows在个人用户领域。由此可见,用户需求决定了所采用的操作系统。不管什么原因,如果要学习Linux,那么首先要将思维从Windows的"这个小河"中拖出来,放入UNIX的海洋。

6.学习Shell

对于Shell(中文名称壳),习惯Windows的读者肯定是非常陌生的,因为Windows只有一个"Shell"(如果可以说是Shell的话),那就是Windows自己。用一句话容易理解的解释就是,shell是用户输入命令与系统解释命令之间的中介。最直观的说法,一种Shell有一套自己的命令。举一个容易理解的例子,Linux的标准Shell是Bash Shell;Solaris的shell是B shell;Linux的Shell是以命令行的方式表现出来的。读者可能会不理解,Windows从命令行"进化"到了图形界面,那么Linux现在还使用命令行岂不是一种倒退?当初我刚刚接触Linux时就曾有过这种想法。可是后来发现,如果使用图形界面,那么分配给应用软件的资源就少了,在价格昂贵的服务器上,能够以较低的硬件配置实现同样的功能是非常重要的。

下面举例说明:一台服务器有1GB内存,假设其中512MB用于处理图形界面,若要安装一个需要784MB内存的数据库软件,唯一的办法就是扩大内存。但是如果使用命令行,系统可能只需要64MB内存,其他的内存就可以供数据库软件使用了。使用命令行,不仅是内存,而且CPU及硬盘等资源的占用都要节省很多。所以,作为服务器,使用命令行是优点而不是缺点。既然Shell有这么多优点,就必须要学习它。

7.勤于实践

要增加自己Linux的技能,只有通过实践来实现了。所以,赶快找一台计算机,赶快安装一个Linux发行版本,然后进入精彩的Linux世界。相信对于你自己的Linux能力必然大有斩获。此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是资料被你抹掉了,否则存储的资料将永远而且立刻地记忆在硬盘中。在人类记忆的曲线中,你必须要不断地重复练习才会将一件事情记得比较熟。学习Linux也一样,如果你无法经常学习的话,学了后面的,前面的往往忘了。对Linux命令熟悉后,可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。当然你不需搭建所有服务,可以慢慢来。需要说明的是这个Linux网络对于初学者有两三台计算机即可。自己多动手,不要非要等着别人帮你解决问题。

8.学会使用文档

和私有操作系统不同,各个Linux的发行版本的技术支持时间都较短,这对于Linux初学者是往往不够的。其实当你安装了一个完整的Linux系统后,其中已经包含了一个强大的帮助系统,只是可能你还没有发现和使用它们的技巧。主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。查阅经典工具书和Howto,特别是Howto是全球数以万计的Linux、UNIX的经验总结非常有参考价值,通常40%的问题可以解决。安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么了。如果说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。

当查找文档时,一定要看文档是在何种版本、何种环境及何种状态下出现的何种结果。对于文档的有效性,一时还无法在操作前就知道结论如何,那么对某个专题或问题,阅读相关的多篇文章将会节省大量的时间,还可以保证尽量"干净"的环境,有效避免因为不同操作所造成的更多问题。操作时要仔细核对各个步骤及输出的结果,尽量保持与文档一致。 9.在Linux论坛获取帮助

如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问,否则只会得到到草率的回答或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。最好先搜寻一下论坛是否有你需要的文章。这样可以获得事半功倍的效果。

你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。可能你会遇到这种情况,对于一个问题会出现不同内容回答,这时你需要通过实践来验证。另外把这个问题放在其他Linux社区请求帮助也是一种选择。如果得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

10.学习专业英文

如果你想深入学习Linux,看不懂文档,因为实在是太难了。写得最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表。

通过man、info等命令,可以从在线帮助中快速地获得所需要的命令和操作方法。不要害怕海量的系统帮助,仔细阅读几个man或info文档就会发现,这些帮助几乎都按照固定格式写成命令名称、参数、参数说明、使用例子、参考等。当英语成为一种习惯,就会自觉地查找或订阅互联网上感兴趣的英文材料。这样,在不知不觉中就已经和世界同步了。

11.在社区共享你的经验

随着Linux应用的扩展,出现了不少Linux社区。其中有一些非常优秀的社区:水木清华、其中有一些非常优秀的社区:www.linuxforum.net(国内最高水平GNU站点)、http://www.chinaunix.net/(中国最大的Unix技术社区),随着知识的不断积累,就可以把自己动手解决一些前人没有遇到的问题写出文档在网络上共享给其他读者。这个时候,也就成为了一名"高手"。Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人,Linux高手更具有鼓励新手的文化精神。

最后是笔者的Linux学习的一个路线图(roadmap):

了解Linux的基础知识,这些包含了用户管理、群组的概念、权限的观念等;

掌握100个以上的常用命令;

掌握.tgz、.rpm等软件包的常用安装方法

学习添加外设,安装设备驱动程序(比如网卡)

熟悉Linux文件系统和目录结构。

掌握vi,gcc,gdb等常用编辑器,编译器,调试器。

理解shell别名、管道、I/O重定向、输入和输出及shell脚本编程。

网络的基础包括:掌握路由概念、OSI七层网络模型、TCP/IP模型及相关服务对应的层次对于Linux学习非常重要的。然后学习Linux环境下的组网。

以上是Linux学习方法,希望对你有些帮助。

posted @ 2012-06-08 18:18 hoshelly 阅读(337) | 评论 (0)编辑 收藏


建立一个链表,其中的节点包括学号,成绩信息。要求用动态插入链表的方法实现,就是输入第一个节点信息时,则必须创建该链表,之后每输入一个学生节点的基本信息,就把该节点插入到已有的链表当中。要求按照学号顺序插入。输入的时候可以不按照学号的顺序,输入0 0 表
示输入结束。
(不允许对输入的数据排序后再创建链表)

Sample Input

1 50
4 60
2 70
3 80
5 64
0 0 

Sample Output

The list is:
1 50
2 70
3 80
4 60
5 64



#include<stdio.h>
#include<stdlib.h>

struct student
{
    int number;
    float score;
    struct student *next;
};

int main()
{
    int n=0;
    struct student *head,*p1;
    p1=(struct student*)malloc(sizeof(struct student));
    scanf("%d %f",&p1->number,&p1->score);
    head=p1;
    head->next=NULL;
    while(p1->number!=0 && p1->score!=0)
    {
          n++;
          p1->next=(struct student*)malloc(sizeof(struct student));
          p1=p1->next;
          p1->next=NULL;
          scanf("%d %f",&p1->number,&p1->score);
    }
    
    struct student *p3,*p4;
    p3=(struct student*)malloc(sizeof(struct student));
    p4=(struct student*)malloc(sizeof(struct student));
    for(int i=0;i<n;i++) 
    {    
        p3=head;
        for(int j=0;j<n-i-1;j++)
        {
            p4=p3->next;
            if(p3->number>p4->number)
            {
                int k=p3->number;
                p3->number=p4->number;
                p4->number=k;
                float m=p3->score;
                p3->score=p4->score;
                p4->score=m;
            }
            p3=p3->next;
        }
    }
    printf("The list is:\n");
     p3=head;
     do
     {
      if(p3->number ==0 && p3->score==0)
          continue;
      printf("%d %.0f\n",p3->number,p3->score); 
      p3=p3->next;
    }while(p3!=NULL);

    free(p1);
    free(p3);
    free(p4);
    return 0;
}
    

posted @ 2012-05-12 10:29 hoshelly 阅读(1805) | 评论 (0)编辑 收藏

输入
第一行包含一个整数T,表示有T组测试数据。对于每组测试数据:第一行包含一个整数N,表示有N个元素(N不大于50),第二行包含N个整数,表示这N个元素(各个元素的值小于1000)。

输出
对于每组测试数据,输出一行,包含一个数据即返回的最小值。

样例输入
2
3
3 2 1
5
-1 5 3 -2 4
样例输出
1
-2

解法一:
将一个数组,分成两部分,然后求出两部分中的最小值,当然这里有一个要考虑的情况是,然后元素的个数为奇数个的时候,我们可以将其分为三部分,中间元素,前半部分,后半部分。然后使用递归的方法,求出数组元素中的最小值。

#include<stdio.h>
int Min(int a[],int n)
{
    int a1,a2,a3;
    if(n==1)
        return a[0];
    if(n%2==0)
    {
        a1=Min(a,n/2);
        a2=Min(a+n/2,n/2);
        if(a1>a2)
            return a2;
        else
            return a1;
    }
    else
    {
        a1=Min(a,n/2);
        a2=Min(a+n/2+1,n/2);
        a3=a[n/2];
        if(a1>a2)
        {
            if(a2>a3)
                return a3;
            else
                return a2;
        }
        else
        {
            if(a1>a3)
                return a3;
            else
                return a1;
        }
    }
    
}


int main()
{
    int n,m,i;
    int a[50];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%d",&a[i]);
        }
        printf("%d\n",Min(a,m));
    }
    return 0;
}

解法二:
代码如下
#include<stdio.h>
int Min(int a[],int n)
{
    if(n==0)
        return a[0];
    else
        return ((Min(a,n-1)<a[n])? Min(a,n-1):a[n]);
    
}


int main()
{
    int n,m,i;
    int a[50];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%d",&a[i]);
        }
        printf("%d\n",Min(a,m-1));
    }
    return 0;
}


posted @ 2012-05-09 00:50 hoshelly 阅读(3054) | 评论 (0)编辑 收藏

输入

第一行包含一个整数T,表示有T组数据。对于每组数据:第一行包含一个数字N(<100),表示该组数据由N个元素;第二行包含N个数,就是这N个元素的值( <10000 )。

输出

对于每组数据输出一行,包含排序好后的N个元素,要求从小到大排序,相邻2个元素间有个空格,末尾无空格有个回车。

样例输入
1 3 1 3 2
样例输出
1 2 3


#include<stdio.h>
void swap(int a[],int low,int high)
{
    
int temp=a[low];
    a[low]
=a[high];
    a[high]
=temp;
}

int partition(int a[],int low,int high)
{
    
int pivotkey=a[low];
    
while(low<high)
    {
        
while(low<high && a[high]>=pivotkey)
            high
--;
        swap(a,low,high);
        
while(low<high && a[low]<=pivotkey)
            low
++;
        swap(a,low,high);
    }
    
return low;
}

void qsort(int a[],int low,int high)
{
    
int pivot;
    
if(low<high)
    {
        pivot
=partition(a,low,high);
        qsort(a,low,pivot
-1);
        qsort(a,pivot
+1,high);
    }
}


int main()
{
    
int n,m,i,a[102];
    scanf(
"%d",&n);
    
while(n--)
    {
        scanf(
"%d",&m);
        
for(i=0;i<m;i++)
        {
            scanf(
"%d",&a[i]);
        }

        qsort(a,
0,m-1);

            
        
for(i=0;i<m;i++)
        {
            printf(
"%d ",a[i]);
        }
        printf(
"\n");

    }

    
return 0;
}

posted @ 2012-05-08 17:11 hoshelly 阅读(127) | 评论 (0)编辑 收藏

仅列出标题
共12页: First 3 4 5 6 7 8 9 10 11 Last