取出N个数中出现次数大于N/2的数字

先初始化随机输入的数字N的个数个数字,人为知道一个未知数n,其出现次数大于N/2
然后用快速排序,用相差N/2-1个数之间是否相等判断哪些数是n。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <string.h>
using namespace std; 
bool type1(char N1[],int N2);
unsigned int a2ul(char *s);
void sort(int *a, int left, int right); 
int main()
{
    char str[100],m='1';
    //参数seed是rand()的种子,用来初始化rand()的起始值。
                   //如果用户在此之前调用过srand(seed),给seed指定了一个值,
                   //那么它会自动调用srand(seed)一次来初始化它的起始值
    while(m=='1')
    {    
        int j=0;
        printf("please input the string: 
");
        scanf("%s",str); 
        j=strlen(str);//得到的结果是存储的长度 
        //printf("%d",j);
        sizeof(str);//得到的结果是30
        if(type1(str,j))
        {
            unsigned int a=a2ul(str);
            int arry1[a];
            srand(time(0));
            for(int i=0;i<a;i++)
                {
                if((i==(a+1)/2)||(i>a/2))//因为a/2是整数所以这里取a+1 
                {
                arry1[i]=arry1[i-1];    
                }else{
                arry1[i]=rand()%100+1;
                }
                printf("arry1[%d]:%3d
",i,arry1[i]);
                }
            sort(arry1,0,a-1);
            printf("排序后
"); 
            int c=0,d=-1;
            for(int i=0;i<a;i++)
            {
                if(arry1[i]==d||(i<(a+1)/2&&arry1[i]==arry1[i+a/2])){
                    printf("arry1[%d]:%3d ***%d
",i,arry1[i],++c);
                    d=arry1[i];
                }else{
                    printf("arry1[%d]:%3d
",i,arry1[i]);
                }
            }
        }else
        {
            //continue;
        }
        puts("
1:继续
2:结束");
        fflush(stdin);//清除输入缓冲 
        scanf("%c",&m);
        while(m!='1'&&m!='2')
        {
            puts("选项无效!
请重新输入。");
            puts("
1:继续
2:结束");
            scanf("%c",&m);
        }
        if(m=='2'){
            break;//return 0; 
        }
        
    }
    return 0;
}
bool type1(char N1[],int N2)
{
     for(int i=0;i<N2;i++)
        if(N1[i]>='0'&&N1[i]<='9') 
        {
            //continue;
            //cout<<"该字符为数字"<<endl;
        }else
        {
            printf("%c 不是数字!请重新输入:",N1[i]);
            return false;
        }
        /*else if( (N1[i]>='a'&&(N1[i]<='z'))||(N1[i]>='A'&&(N1[i]<='Z')) ) //字符区分大小写 
        {
        
            //cout<<"该字符为字母"<<endl;
            printf("%c 不是数字!请重新输入:",N1[i]);
            return false;
        }*/
     return true;    
}
unsigned int a2ul(char *s)
{
    unsigned long n;
    for(n=0;*s;s++)
    {
        n=n*10+*s-'0';
    }
    return n;
}
void sort(int *a, int left, int right)
{
    if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];
     
    while(i < j)                               /*控制在当组内寻找一遍*/
    {
        while(i < j && key <= a[j])
        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
        序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ 
        {
            j--;/*向前寻找*/
        }
         
        a[i] = a[j];
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
        a[left],那么就是给key)*/
         
        while(i < j && key >= a[i])
        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
        因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        {
            i++;
        }
         
        a[j] = a[i];
    }
     
    a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
    sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
                       /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
原文地址:https://www.cnblogs.com/Babylon/p/8027562.html