c语言程序清单.docx
- 文档编号:23207549
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:34
- 大小:29.92KB
c语言程序清单.docx
《c语言程序清单.docx》由会员分享,可在线阅读,更多相关《c语言程序清单.docx(34页珍藏版)》请在冰豆网上搜索。
c语言程序清单
1.约瑟夫问题:
n个人围城一圈,每个人有一个密码m,并初始化一个密码m0,现在从第一个人开始报数,报到m0,则出圈,从下一个人开始从1开始继续报数,密码为出圈的密码,直到下一个人出圈为止。
#include
#include
//创建结构
typedefstructNode
{intm;//密码
intn;//数字
structNode*next;
}Node,*Linklist;
//生成循环单链表,Z为总人数
LinklistCreate(intz)
{inti,mm;//i为序号,mm为数字
LinklistH,r,s;H=NULL;
for(i=1;i<=z;i++)
{printf("输入%d号的密码:
\n",i);
scanf("%d",&mm);
s=(Linklist)malloc(sizeof(Node));//添加新节点即人员
s->m=mm;s->n=i;
printf("%d号的密码是:
%d\n",i,mm);
if(H==NULL)
{H=s;r=H;}
else{r->next=s;//链接上一个节点
r=s;//r向后移1位}
}
r->next=H;//构成循环列表
returnH;
}
voidsearch(LinklistH,intm0,intz)//z为总人数,m0为要数的数字
{intcount=1;//累积报数人数
intnum=0;//标记出列人数
Linklistpre,p;p=H;
printf("出列的顺序为:
\n");
while(num {do{count++;pre=p;p=p->next; }while(count pre->next=p->next;//删除数到的人所在的节点 printf("%d",p->n);//打印出列人的序列 m0=p->m;//将出列的人的密码作为新的数数号 free(p); p=pre->next;//将p移动到下一个节点 num++;//移出去的人增加 count=1; }//} voidmain(){ intz,m0;LinklistH; printf("..........................................................................\n"); printf("请输入总人数: \n");scanf("%d",&z); printf("请输入初始报数值: \n");scanf("%d",&m0); H=Create(z);search(H,m0,z); } 2.日历问题: 中国有句俗语叫“三天打鱼两天晒网”。 某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。 #include intdays(structdateday); structdate{intyear;intmonth;intday;}; voidmain() {structdatetoday,term; intyearday,year,day; printf("Enteryear/month/day: "); scanf("%d%d%d",&today.year,&today.month,&today.day);/*输入日期*/ term.month=12;/*设置变量的初始值: 月*/ term.day=31;/*设置变量的初始值: 日*/ for(yearday=0,year=1990;year {term.year=year; yearday+=days(term);/*计算从1990年至指定年的前一年共有多少天*/ }yearday+=days(today);/*加上指定年中到指定日期的天数*/ day=yearday%5;/*求余数*/ if(day>0&&day<4)printf("hewasfishingatthatday.\\n");/*打印结果*/ elseprintf("Hewassleepingatthatday.\\n"); } intdays(structdateday) {staticintday_tab[2][13]= {{0,31,28,31,30,31,30,31,31,30,31,30,31,},/*平均每月的天数*/ {0,31,29,31,30,31,30,31,31,30,31,30,31,}}; inti,lp; lp=day.year%4==0&&day.year%100! =0||day.year%400==0; /*判定year为闰年还是平年,lp=0为平年,非0为闰年*/ for(i=1;i day.day+=day_tab[lp][i]; returnday.day;} 3.矩阵应用: 给定一个整数N,生成一个N*N的矩阵,矩阵中元素取值为1至N2,1在左上角,其余各数按顺时针方向旋转前进,依次递增放置。 例如,当N=4时,矩阵中的内容如下: 1234 1213145 1116156 10987 #include #include main() {int**a,i,j,x,y,n; printf("inputtheN: "); scanf("%d",&n); a=(int**)malloc(sizeof(int*)*n); for(i=0;i a[i]=(int*)malloc(sizeof(int)*n); for(i=0;i a[i][j]=0; for(i=1,j=x=y=0;i<=n*n;i++) {a[x][y]=i; switch(j)/*j为前进方向,0向右,1向下,2向左,3向上。 */ {case0: if(y+1>n-1||a[x][y+1]! =0){j=1;x++;}elsey++;break; case1: if(x+1>n-1||a[x+1][y]! =0){j=2;y--;}elsex++;break; case2: if(y-1<0||a[x][y-1]! =0){j=3;x--;}elsey--;break; case3: if(a[x-1][y]! =0){j=0;y++;}elsex--;break; }} for(i=0;i {for(j=0;j printf("%4d",a[i][j]); printf("\n"); free(a[i]); } free(a);} 4.曲线绘制问题 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 #include #include voidmain() {inti,x;floaty; for(y=1;y>=-1;y=y-0.1) {x=acos(y)*10; for(i=1;i printf(""); printf("*"); for(;i<60-x;i++) printf(""); printf("*\n");} printf("\n\n");} 5.打印杨辉三角 #include intyang(intx,inty)//计算x行y列的杨辉三角值 {if(y==1||y==x) return1;Elsereturnyang(x-1,y-1)+yang(x-1,y);} voidmain() {intn;//输入行数printf("请输入要打印的杨辉三角的的行数: \n"); scanf("%d",&n); for(i=1;i<=n;i++) {for(j=1;j<=n-i;j++)printf(""); for(j=1;j<=i;j++)printf("%3d",yang(i,j)); printf("\n"); }} 6.A判断是否是素数 intfflag(inti)/*判断是否为素数*/ {intj; if(i<=1)return0; if(i==2)return1; if(! (i%2))return0; for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)//折半 if(! (i%j))return0; return1;} B判断最大公约数 intGCD(intm,intn) {inttemp; if(m>n)//m为较小值 temp=m,m=n,n=temp; while(m! =0){temp=n%m;n=m;m=temp;} returnn; } 7.值班问题 医院有A、B、C、D、E、F、G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天。 现在已知: A大夫比C大夫晚一天值班; D大夫比E大夫晚二天值班; B大夫比G大夫早三天值班; F大夫的值班日在B和C大夫的中间,且是星期四; 请确定每天究竟是哪位大夫值班? #include #include inta[8]; char*day[]={"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};/*建立星期表*/ voidmain() {charch='A'; inti,j,t; a[4]=6;/*星期四是F值班*/ for(i=1;i<=3;i++) {a[i]=2;/*假设B值班的日期*/ if(! a[i+3])a[i+3]=7;/*若三天后无人值班则安排G值班*/ else{a[i]=0;continue;}/*否则B值班的日期不断对*/ for(t=1;t<=3;t++)/*假设E值班的时间*/ { if(! a[t])a[t]=5;/*若当天无人值班则安排E值班*/ elsecontinue; if(! a[t+2])a[t+2]=4;/*若E值班两天后无人值班则应为D*/ else{a[t]=0;continue;}/*否则E值班的日期不对*/ for(j=5;j<7;j++) { if(! a[j])a[j]=3;/*若当天无人值班,则安排C值班*/ elsecontinue; if(! a[j+1])a[j+1]=1;/*C之后一天无人值班则应当是A值班*/ else{a[j]=0;continue;}/*否则A值班日期不对*/ for(i=1;i<=7;i++)/*安排完毕,输出结果*/ printf("医生%c排班是: %s.\n",ch+i-1,day[a[i]]); exit(0); }}}} 8.谁跑的慢 张王李三家各有三个小孩。 一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得9分,跑第2得8分,依此类推。 比赛结果各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。 已知获第一名的是李家的孩子,获得第二的是王家的孩子。 问获得最后一名的是谁家的孩子? #include voidmain(){ intscore[4][4]; intzhang,wang,li; introw,line,flg; score[1][1]=7;//张家 score[2][1]=8;//王家 score[3][1]=9;//李家//张家余下8分//王家余下7分//李家余下6分 for(zhang=4;zhang<6;zhang++) for(wang=4;wang<=6;wang++) for(li=4;li<=6;li++){ if(zhang! =wang&&zhang! =li&&wang! =li &&(8-zhang)! =(7-wang)&&(8-zhang)! =(6-li) &&(6-li)! =(7-wang)){ score[1][2]=zhang; score[1][3]=8-zhang; score[2][2]=wang; score[2][3]=7-wang; score[3][2]=li; score[3][3]=6-li;}} for(row=1;row<=3;row++) {for(line=1;line<=3;line++) {if(score[row][line]==1) flg=row; printf("%3d",score[row][line]); } printf("\n"); } switch(flg) {case1: printf("跑得最慢的是张家孩子! \n");break; case2: printf("跑得最慢的是王家孩子! \n");break; case3: printf("跑得最慢的是李家孩子! \n");break; }} 9.拉丁方程 构造NXN阶的拉丁方阵(2<=N<=9),使方阵中的每一行和每一列中数字1到N只出现一次。 如N=4时: 1234 2341 3412 4123 #include inti,j,k,t,N; printf("请输入N值: \n"); scanf("%d",&N); printf("可能的拉丁矩阵有: \n"); for(j=0;j {for(i=0;i {t=(i+j)%N;/*确定该拉丁方阵第i行的第一个元素的值*/ for(k=0;k printf("%2d",(k+t)%N+1);printf("\n");} printf("\n");}} 10.1—9数字应用 A.将1到9这九个数字分成三个3位数,分求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍。 问应当怎样分法。 #include intok(intt,int*z); inta[9]; voidmain() { intm,count=0; for(m=123;m<=333;m++)/*试探可能的三位数*/ if(ok(m,a)&&ok(2*m,a+3)&&ok(3*m,a+6))/*若满足题意*/ printf("No.%d: %d%d%d\n",++count,m,2*m,3*m);/*输出结果*/ } intok(intt,int*z)/*分解t的值,将其存入z指向的三个数组元素,若满足要求返回1*/ {int*p1,*p2; for(p1=z;p1 {*p1=t%10;/*分解整数*/ t/=10; for(p2=a;p2 if(*p1==0||*p2==*p1)return0;/*若重复则返回*/ } return1;/*否则返回1*/ } B.将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一个平方数。 #include voidmain() { inta[20],num[20][3],b[10];/*a: 存放满足条件的三位数*/ /*若不是10的倍数,则分解三位数*/ /*分解该三位数中的每一个数字*/ inti,j,k,m,n,t,flag; printf("The3squareswith3differentdigitseachare: \n"); for(j=0,i=11;i<=31;i++)/*求出是平方数的三位数*/ if(i%10! =0)/*若不是10的倍数,则分解三位数*/ { k=i*i;/*分解该三位数中的每一个数字*/ num[j+1][0]=k/100;/*百位*/ num[j+1][1]=k/10%10;/*十位*/ num[j+1][2]=k%10;/*个位*/ if(! (num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]|| num[j+1][1]==num[j+1][2]))/*若分解的三位数字均不相等*/ a[++j]=k;/*j: 计数器,统计已找到的满足要求的三位数*/ } for(i=1;i<=j-2;++i)/*从满足条件的三位数中选出三个进行组合*/ { b[1]=num[i][0]; b[2]=num[i][1]; b[3]=num[i][2]; for(t=i+1;t<=j-1;++t) { b[4]=num[t][0];/*取第t个数的三位数字*/ b[5]=num[t][1]; b[6]=num[t][2]; for(flag=0,m=1;! flag&&m<=3;m++)/*flag: 出现数字重复的标记*/ for(n=4;! flag&&n<=6;n++)/*判断两个数的数字是否有重复*/ if(b[m]==b[n])flag=1;/*flag=1: 数字有重复*/ if(! flag) for(k=t+1;k<=j;k++) { b[7]=num[k][0];/*取第k个数的三位数字*/ b[8]=num[k][1]; b[9]=num[k][2]; for(flag=0,m=1;! flag&&m<=6;m++)/*判断前两个数字是否*/ for(n=7;! flag&&n<=9;n++)/*与第三个数的数字重复*/ if(b[m]==b[n])flag=1; if(! flag)/*若均不重复则打印结果*/ printf("%4d,%4d,%4d\n",a[i],a[t],a[k]); } } } } 11.乘式还原 A代表数字0到9中的前五个数字,Z代表后五个数字,请还原下列乘式。 AZA ×AAZ ------------ AAAA AAZZ ZAA ------------ ZAZAA #include voidprint(longa,longb,longs1,longs2,longs3); intjud(longq,char*pflag); voidmain() {longi,j,k,l,m,n,term,t1,t2,t3; intflag; for(i=0;i<=4;++i)/*被乘数的第一位*/ for(j=5;j<=9;++j)/*被乘数的第二位*/ for(k=0;k<=4;++k)/*被乘数的第三位*/ { term=100*i+10*j+k;/*被乘数*/ for(flag=0,n=0;n<4&&! flag;)/*乘数的第一位*/ flag=jud((t3=++n*100*term)/100,"001");/*判断第三个部分积*/ if(flag) {for(flag=0,m=0;m<4&&! flag;)/*乘数的第二位*/ flag=jud((t2=++m*10*term)/10,"1100");/*判断第二个部分积*/ if(flag) {for(flag=0,l=5;l<9&&! flag;)/*乘数的第三位*/ flag=jud(t1=++l*term,"0000");/*判断第一个部分积*/ if(flag&&jud(t1+t2+t3,"00101"))/*判断乘式的积*/ print(term,n*100+m*10+l,t1,t2,t3); }}}} voidprint(longa,longb,longs1,longs2,longs3)/*打印结果*/ {printf("\n%ld\n",a); printf("*)%ld\n",b); printf("......................\n"); printf("%ld\n%ld\n%ld\n",s1,s2/10,s3/100); printf("......................\n"); printf("%ld\n",a*b);} intjud(longq,char*pflag)/*判断一个数的每一位是否满足要求的判断函数*/ /*q: 需要判断的数。 pflag: 标志字符串,A用1表示,Z用0表示。 标志串排列顺序: 个十百...*/ {charch='0'; while(q! =0&&*pflag! =NULL)/*循环判断对应位的取值范围是否正确*/ if((*pflag-ch)! =(q%10>=5? 1: 0)) return0; else{q/=10;++pflag;/*若相符则取下一位进行判断*/ } if(q==0&&*pflag==NULL)/*q的位数与标志字符串的长度相同时,返回1*/ return1;elsereturn0; } 12.除式还原 给定下列除式,其中包含5个7,其它打×的是任意数字,请加以还原。 ×7×--------------商 -------------- 除数------××|×××××-------------被除数 ×77 -------------- ×7× ×7× ---------- ×× ×× #include voidmain() {longinti; intj,l; for(i=10000;i<=99999;i++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 程序 清单