丢手帕问题:
//筛选法解决
#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("*");
}
}
一些C语言题目
最新推荐文章于 2024-03-21 18:23:30 发布