一些C语言题目

丢手帕问题:

//筛选法解决
#include<stdio.h>
#define n 10
#define m 3

void main()
{
    int a[n+1]={0};
    int k=n;
    int count;
    int i=0;
    
    while(k>0){
        count=m;
        while(count>0){
            i=(i+1)%(n+1);
            if(i==0)
                i=1;
            if(a[i]==0)
                count--;
        }
        a[i]=1;
        printf("%-4d",i);
        k--;
    }
    printf("\nThe last one is %d\n",i);
   
}

//循环链表法解决
#include<stdio.h>
#include<stdlib.h>
#define n 10
#define m 3

struct node{
    int num;
    struct node *next;
};

void creat_link(struct node *head)
{
    struct node *p,*q;
    int i;
    p=head;
    p->num=1;
    for(i=2;i<=n;i++){
        q=(struct node *)malloc(sizeof(struct node));
        q->num=i;
        q->next=head;
        p->next=q;
        p=q;
    }

}

void main()
{
    struct node *head,*p,*q,*temp;
    int count;

    head=(struct node *)malloc(sizeof(struct node));
    creat_link(head);

    p=head;
    while(p!=p->next){
            count=1;
            while(count<m-1){
                p=p->next;
                count++;
                }
                temp=p->next;
                printf("%-4d",temp->num);

                p->next=p->next->next;
                p=p->next;
                free(temp);

    }
    printf("\nThe last one is %-4d\n",p->num);
    
}





2、联合体的应用之十六进制高低倒转
#include<stdio.h>
int main()
{
    union body{
        struct BYTE{
            unsigned char l,h;
        }byte;
        unsigned int word;
    }a,b;
    printf("Enter data?\n");
    scanf("%x",&a.word);
    b.byte.l=a.byte.h;
    b.byte.h=a.byte.l;
    printf("%x->%x\n",a.word,b.word);
    return 0;
}



链表倒置,采用的是头插法
#include<stdio.h>
#include<stdlib.h>
struct node{
    int num;
    struct node *next;
};

void turn(struct node *head);

int main()
{
    struct node *head,*p,*q;
    int x;
    scanf("%d",&x);
    head=(struct node *)malloc(sizeof(struct node));
    head->next=NULL;
    q=head;
    while(x!=-1){
        p=(struct node *)malloc(sizeof(struct node));
        p->num=x;
        p->next=NULL;
        q->next=p;
        q=q->next;
        scanf("%d",&x);
    }

    turn(head);
    printf("After turning\n");
    p=head->next;
    while(p!=NULL){
        printf("%d ",p->num);
        p=p->next;
    }
    printf("\n");
    getch();
    return 0;
}

void turn(struct node *head)
{
    struct node *p,*q;
    p=head->next ;
    head->next=NULL;
    while(p!=NULL){
          q=p->next;
          p->next=head->next;
          head->next=p;
          p=q;
    }
}


统计输入的数字串里各数字的个数
#include<stdio.h>

int main()
{
    char str[50];
    int count[10]={0};
    int i=0;
    printf("Enter numbers");
    gets(str);
    while(str[i]!='\0'){
        count[str[i]-'0']++;
        i++;    
    }
    for(i=0;i<10;i++)
        printf("%d:%d\n",i,count[i]);
  return 0;    
  
}


统计输出输入的学生成绩的最高分和最低分对应的学生的学号
#include<stdio.h>
#define N 100
struct stu{
    int num;
    float score;
};

int main()
{
    struct stu info[N];
    int i;
    struct stu max,min;
    for(i=1;i<=N;i++)
        scanf("%d%f",&info[i].num,&info[i].score);
    max=min=info[1];
    for(i=2;i<=N;i++)
        if(info[i].score>max.score)
            max=info[i];
        else if(info[i].score<min.score)
            min=info[i];
    printf("Max:\n");
    printf("num score\n");
    for(i=1;i<=N;i++)
        if(max.score==info[i].score)
            printf("%d:%d\n",i,min.score);
    printf("Min:\n");
    printf("num score\n");
    for(i=1;i<=N;i++)
        if(min.score==info[i].score)
            printf("%d:%d\n",i,min.score);

        return 0;
    
}




从键盘输入5个数,输出最小公倍数 

#include<stdio.h>
int find(int a,int b);
int main()
{
    int a[5],i,x;
    printf("Enter 5 numbers\n");
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
    x=a[0];
    for(i=1;i<5;i++)
        x=find(a[i],x);
    printf("%d\n",x);
    return 0;
}

int find(int a,int b)
{
    int d;
    if(a>b){
        d=a;
        a=b;
        b=d;
    }
    for(d=b;;d+=b)
        if(d%a==0)
            return d;
}


链表操作:输入一串数,再输入一个待删除的数字,删除这个待删除的数字
#include<stdio.h>
#include<stdlib.h>

struct node{
    int num;
    struct node *next;
};


void del(struct node *head,int x);

int main()
{
    struct node *head;
    struct node *p,*q;
    int x;
    head=(struct node *)malloc(sizeof(struct node));
    head->next=NULL;
    q=head;
    printf("Enter numbers and -1 is end\n");


    while(1){
        scanf("%d",&x);
        if(x==-1)
            break;
        p=(struct node *)malloc(sizeof(struct node));
        p->num=x;
        p->next=NULL;
        
        q->next=p;
        q=q->next;
    }

    printf("\nEnter the number you want to delete:");
    scanf("%d",&x);
    

    del(head,x);
    printf("After deleting:");

    p=head->next;
    while(p){
        printf("%-4d",p->num);
        p=p->next;
    }

    getch();
    return 0;
}

void del(struct node *head,int x)
{
    struct node *p,*temp;
    
    p=head;
    while(p->next){
        if(p->next->num==x){
            temp=p->next;
            p->next=p->next->next;
            free(temp);        
        }
        else
            p=p->next;
    }

    return ;
}


移位操作,对输入的一个十进制数,输出它的二进制表示 
#include<stdio.h>
void main()
{
    int i;
    unsigned int number,temp;
    scanf("%u",&number);
    printf("%x\n",number);
    for(i=15;i>=0;i--){
       temp=(number&0x8000);
       temp>>=15;
       printf("%1x",temp);
       number<<=1;
    }
}


9、输出ASCII码表

#include<stdio.h>
void mian()
{
    int i=32;
    printf("ASCII code Decimal hexadecimal");
    printf(" ASCII code Decimal hexidecima\n");
    while(i<=79){
        printf("%6c %6d% 0x04x",i,i,i);
        if((i+48)<127)
             printf("%6c %6d% 0x04x",i,i,i);
        i++;
        printf("\n");
    }
    return 0;
}


10、输入年份和这年的第一天是星期几,再输入月份,输出这个月份的日历
#include<stdio.h>
void main()
{
    int year,month,week_day,month_day,i,j,days,first_day;
    printf("Enter the year and Jan,first of the year.\n");
    scanf("%d %d",&year,&week_day);
    printf("Enter the month you want to show.\n");
    scanf("%d",&month);
    days=0;
    for(i=1;i<month;i++)
        switch(i){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:days+=31;break;
            case 4:
            case 6:
            case 9:
            case 11:days+=30;break;
            case 2: if((year%4==0&&year%100!=0)||(year%400==0)) days+=29;else days+=28;break ;
            }
    switch(month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:month_day=31;break;
            case 4:
            case 6:
            case 9:
            case 11:month_day=30;break;
            case 2: if((year%4==0&&year%100!=0)||(year%400==0))
                         month_day=29;
                    else month_day=28;
                    break;
            }

    first_day=(days%7+week_day)%7;

    printf("month Mon. Tue. Wen. Tur. Fri. Sta Sun.\n");
    printf("%-5d",month);

    if(first_day==0){
        first_day=7;
        printf("%42d\n",1);
        printf(" ");
    }
    else
        printf("%*d",6*first_day,1);
    for(i=1;i<month_day;i++){
        printf("%6d",i+1);
        if(((first_day+i)%7)==0){
            printf("\n");
            printf(" ");
        }
    }

    printf("\n");
    return ;
}


11、冒泡排序

void bubble_sort()
{
    int bub[5]={3,4,1,2,7};
    int i,j;
    int temp;
    int change;
    int n=5;
    for(i=1;i<n;i++){
        change=0;
        for(j=1;j<=n-i;j++)
           if(bub[j]>bub[j-1]){
                temp=bub[j];
                bub[j]=bub[j-1];
                bub[j-1]=temp;
                change=1;
           }
         if(change==0)
            break;
     }
    for(i=0;i<n;i++)
        printf("%d\t",bub[i]);
    return ;
}


12、用数组筛选法找出200以内的素数,这个比较classic

void prime()
{
    int prime[201]={0};
    int i;
    int k;
    int d;
    for(d=2;d<=sqrt(200);d++)
       if(prime[d]==0)
            for(i=2*d;i<=200;i=i+d)
                prime[i]=1;
    k=0;
    for(i=2;i<=200;i++)
        if(prime[i]==0){
            k++;
            printf("%d\t",i);
            if(k%5==0)
                printf("\n");
        }
}


13、删除s1中的s2中所含字符
void main()
{
    char s1[30],s2[30];
    char *p1,*p2;
    int i,j,k=0;
    p1=s1,p2=s2;

    printf("Enter string s1 and s2...\n");
    scanf("%s%s",s1,s2);
    for(i=0;*(p1+i)!='\0';i++){
        for(j=0;*(p2+j)!='\0'&&*(p1+i)!=*(p2+j);j++);
            if(*(p2+j)=='\0'){
                *(p1+k)=*(p1+i);
                k++;
        }
    }
    for(i=0;i<k;i++)
        printf("%1c",*(p1+i));
    return ;

}


14、输入起始地址,输出内容
void main()
{
    long int b_addr,e_addr,i;
    int j;
    char *point;
    printf("Enter begain and end addr...\n");
    scanf("%lx %lx",&b_addr,&e_addr);
    for(i=b_addr;i<e_addr;i+=16){
        printf("%lx: ",i);
        point=(char *)i;
        for(j=0;j<16;j++){
            if(j==8)
                printf(" ");
            printf(" %02x",*point);
            point ++;

        }
        printf("\n");
    }
}





对输入的字符加上偶校验位

#include<stdio.h>

struct bit{
    unsigned bit0:1,bit1:1,bit2:1,bit3:1,bit4:1,bit5:1,bit6:1,bit7:1;
}*sp;


void main()
{
     char ch[]="abcde";
     char *dp;
     int bit_sum;
     int parity;
     dp=ch;
     while(*dp!='\0'){
          sp=(struct bit*)dp;
          bit_sum=sp->bit0+sp->bit1+sp->bit2+sp->bit3+sp->bit4+sp->bit5+sp->bit6;
          parity=bit_sum%2;
          printf("%c:%d%d%d%d%d%d%d\n",*dp,parity,sp->bit6,sp->bit5,sp->bit4,sp->bit3,sp->bit2,sp->bit1,sp->bit0);
          dp++;
     }
}



质数分解:

例如:45=3*3*5

#include<stdio.h>

void main()
{
    int a[100];
    int x,t,i;
    printf("x=");
    scanf("%d",&x);
     printf("%d=",x);
    if(x<1){
        printf("x must greater than 0");
        return ;
    }
    else if(x==1){
        printf("x=1");
        return ;
    }
    else{
        t=2,i=-1;
        while(x!=1){
              if(x%t==0){
                    x=x/t;
                    a[++i]=t;
                    t=2;
                }
                else
                    t++;
        }
    }

    for(t=0;t<=i;t++){
        printf("%d",a[t]);
        if(t<i)
            printf("*");
    }
    
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值