zoukankan      html  css  js  c++  java
  • 40-语言入门-40-C小加之随机数

     
    描述
    ACM队的“C小加同学想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N11000之间的随机整数(0<N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助 C小加 完成去重排序的工作。

    输入
    第一行输入整数T1<T<10)表示多少组测试数据,
    每组测试数据包括2行,
    1行为1个正整数,表示所生成的随机数的个数:N0<N≤100
    2行有N个用空格隔开的正整数,为所产生的随机数。
    (随机数为题目给定的,不需要ACMer生成)
    输出
    输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。
    2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
    样例输入
    1
    10
    20 40 32 67 40 20 89 300 400 15
    样例输出
    8
    15 20 32 40 67 89 300 400
     
    代码:
    #include <stdio.h>
    #include <stdlib.h>
    #include <memory.h>

    //定义无效值
    #define INVALIDATE_DATA -1

    //处理数据
    static void handlerData();
    //插入数据,按从大到小的顺序,且不能重复
    static void insertArrBySort(int *arr,int arrLen,int inputData,int *resultCount);
    //输出结果
    static void printArr(int *arr,int arrLen);

    int main()
    {
         int readLen = 0;
         scanf("%d",&readLen);
         getchar();
        
         while(readLen > 0)
         {
              handlerData();
              --readLen;
         }
        
         return 0;
    }

    //处理数据
    static void handlerData()
    {
         int readLen = 0;
         scanf("%d",&readLen);
         getchar();
        
         int arrLen = readLen;
         int resultCount = arrLen; //记录不相同的数目
         int *arr = (int*)malloc(sizeof(int)*arrLen);
         memset(arr,INVALIDATE_DATA,sizeof(int)*arrLen);
        
         while(readLen>0)
         {
              int inputNumber = 0;
              scanf("%d",&inputNumber);
              insertArrBySort(arr,arrLen,inputNumber,&resultCount);
             
              --readLen;
         }
         //处理换行输入
         getchar();
        
         printf("%d ",resultCount);
         printArr(arr,arrLen);
        
         free(arr);
    }

    //插入数据,按从大到小的顺序,且不能重复
    static void insertArrBySort(int *arr,int arrLen,int inputData,int *resultCount)
    {
         int index = INVALIDATE_DATA;
         int i=0;

         for(;i<arrLen;++i)
         {
              if(arr[i] == inputData) //有重复数据不做处理
                   break;
             
              if(arr[i] < inputData) //定位到存放该数据的索引位置
              {
                   index = i;
                   break;
              }
         }
        
         if(index != INVALIDATE_DATA && index < arrLen) //需要移动数据
         {
              if(arr[index] != -1)
              {
                   i=arrLen - 1;
                   for(;i>index;--i)
                   {
                        arr[i] = arr[i-1];
                   }
              }

              arr[index] = inputData;
         }
         else
         {
              --(*resultCount);
         }
    }

    //输出结果
    static void printArr(int *arr,int arrLen)
    {
         int i=arrLen-1;
         for(;i>=0;--i)
         {
              if(arr[i] == INVALIDATE_DATA) //有重复数据不做处理
                   continue;
             
              printf("%d ",arr[i]);
         }
         printf(" ");
    }
     
    总结:
    1.memset的第一个参数值目标指针,第二个参数是赋值内容,第三个值一定要注意,是sizeof(type)*len
    2.memset需要头文件 #include <memory.h>
    3.malloc需要头文件 #include <stdlib.h>
  • 相关阅读:
    互联网协议入门详解(转)
    文件流结尾的EOF详解
    数字签名是什么?
    SSL/TLS协议运行机制的概述(转)
    图解SSL/TLS协议(转)
    RSA算法原理(转)
    HTML代码简写法:Emmet和Haml(转)
    HTML Email 编写指南(转)
    PHP CodeBase: 判断用户是否手机访问
    Spring Data JPA之Derived query
  • 原文地址:https://www.cnblogs.com/sharpfeng/p/5141938.html
Copyright © 2011-2022 走看看