XTU C语言程序设计实践作业6

1.

排序

Description

N个整数,将其排序输出。

输入

第一行是一个整数K(1<=K<=20),表示有多少个样例,每个样例的第一行是一个整数N(1<=N<=1,000)和一个字符X,X为A时表示升序排序,为D时为降序排列;第二行为N个整数,每个整数都可以使用int表示,每个之间用一个空格隔开。

输出

每个样例输出一行,按排序要求输出整数,每个整数之间输出一个空格。(最后一个整数后不要有空格)

 

Sample Input

23 A3 5 24 D2 5 7 3
 

Sample Output

2 3 57 5 3 2
这个题是作业六第一个题排序
而排序有多种多样的办法,这个题用的是最简单但是复杂度高的交换排序法
其他的排序方法会在一个专题介绍
这个题的交换排序是选择用两个函数来实现的
试着写一下数组函数
int Dsort(int n,int a[])
{
 int i,j;
 int temp;
 for(i=0;i<n-1;i++)
 {
  for(j=i+1;j<n;j++)
  {
      if(a[i]<a[j])
      {
       temp=a[i];
       a[i]=a[j];
       a[j]=temp;
      }
  }
 }
}
这个降序排序把最大的排在最前面,仔细的过程我会在排序专题分析
这个题还有最重要的一点就是最后一个整数没有空格,大家注意一下我是怎么解决的
代码如下
#include<stdio.h>
int Dsort(int n,int a[])
{
 int i,j;
 int temp;
 for(i=0;i<n-1;i++)
 {
  for(j=i+1;j<n;j++)
  {
      if(a[i]<a[j])
      {
       temp=a[i];
       a[i]=a[j];
       a[j]=temp;
      }
  }
 }
}
int Asort(int n,int a[])
{
 int i,j;
 int temp;
 for(i=0;i<n-1;i++)
 {
  for(j=i+1;j<n;j++)
  {
      if(a[i]>a[j])
      {
       temp=a[i];
       a[i]=a[j];
       a[j]=temp;
      }
  }
 }
}
main()
{
 int a[1001];
 int m;
 int i,n;
 char ch;
 scanf("%d",&m);
 while(m--)
 {
     scanf("%d %c",&n,&ch);
     for(i=0;i<n;i++)
     {
         scanf("%d",&a[i]);
     }
     if(ch=='A')
     {
         Asort(n,a);
     }
     if(ch=='D')
     {
         Dsort(n,a);
     }
     for(i=0;i<n-1;i++)
     {
         printf("%d ",a[i]);
     }
     printf("%d",a[i]);
     printf("\n");
 }
}
2
素数
 

对于大于1的自然数,如果n为素数,那么所有大于1且不大于n的平方根的自然数都不能整除n,反之亦然。所以我们可以通过测试来确定n是否为素数。现在给出n,要你求是否为素数,是输出Yes,否则输出No

每行一个正整数n,n<=2^32-1,如果n为0,则输入结束。判断n是否为素数

每行输出一个用例的结果,如果是输出"Yes",否则输出“No”

 
这个题目感觉很简单但是我写这很久都没写出来
在判断素数那一段我本来是这么写的
m = sqrt(n);
     for(i=2;i<=m;i++)
     {
         if(n%i==0)
         printf("No\n");
         break ;
     }
     if(i>m)
        printf("Yes\n");
但是提交上去发现是不对的,输入5什么结果都没有
然后自己试着把5带进去试验一下,确实不行,为什么不行大家可以想一下
然后我又换了一种判断方法,全部在for循环外面判断
代码如下,记得1既不是素数也不是合数
#include<stdio.h>
#include<math.h>
main()
{
 unsigned i,n,m;
 while(scanf("%d",&n))
 {
   if(n==0)
   return 0;
   if(n<=1)
   printf("No\n");
   else
   {
      m = sqrt(n);
   for(i=2;i<=m;i++)
   {
    if(n%i==0)
    break;
   }
    if(i>m)
   printf("Yes\n");
    else
   printf("No\n");
   }
 }
}
5.回文串
如果一个字符串从中间或者某一个字符处断开,离断开点的距离相同的字符如果是相同的或者是大小写关系的话,我们称这种字符串为“回文串”。比如:“abcba”,从“c”处断开,对应的字符依次是b,a,所以为回文串;“abba”从第一个“b”后断开,对应的字符依次是b,a,所以也是回文串。请写一个程序,判断一个字符串是否为回文串。 输入 	第一行是一个整数N,表示有多少个字符串,以后每行一个字符串,字符串只含有英文字母,最长不超过100个字符。 输出 	每行输出一个对应的结果,如果对应行为回文串输出“YES”,否则输出“NO”。
 

Sample Input

5
abbcbc
abbcbba
aa
bab
Aa
 

Sample Output

NO
YES
YES
YES
YES
 这个题首先要定义一个字符串数组,在输入的时候直接送scanf("%s",a);不需要取地址符号,在计算字符串函数strlen时
也是strlen(a),不需要带数组符号,然后要说的就是for()循环中的for(x=0,a[x]==a[j]||a[x]-32==a[j]||a[j]-32==a[x];x++,j--)不太懂,开始计算会输出len-1个结果,后来看了答案改过来然后提交过了,留给以后去验证
代码如下
#include<stdio.h>
#include<string.h> 
  main(){
  int n;
  int x,i,j,len;
  char a[101]; 
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%s",a);
    len = strlen(a);
    j = len-1;
    for(x=0;a[x]==a[j]||a[x]-32==a[j]||a[j]-32==a[x];x++,j--);
    if(x<j)
    printf("NO\n");
    else
    printf("YES\n");
  }
}
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_40111789/article/details/78453294
今日推荐