C语言经典编程题.doc_第1页
C语言经典编程题.doc_第2页
C语言经典编程题.doc_第3页
C语言经典编程题.doc_第4页
C语言经典编程题.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

“蓝桥杯”软件大赛练习题求素数最大公约数和最小公倍数连续自然数分数比较猜数字游戏抓交通肇事犯古堡算式约瑟夫问题捕鱼问题出售金鱼亲密数完全数加密巧夺偶数数字移动1、求101200之间一共有多少个素数#include #include int su(int m) int i,n=1; for(i=2;i=sqrt(m);i+) if (m%i=0) n=0; break; return n;main() int i,num=0; for(i=101;i=200;i+) if(su(i) num+; printf(101200之间素数个数是%d,num);2、求最大公约数和最小公倍数#include int zdgxs(int x,int y) int t; if(xy) t=x;x=y;y=t; t=x%y; while(t) x=y; y=t; t=x%y; return y;int zxgbs(int x,int y) return (x*y/zdgxs(x,y);main() int a,b,gxs,gbs; printf(please input two numbers:); scanf(%d%d,&a,&b); gxs=zdgxs(a,b); gbs=zxgbs(a,b); printf(%d和%d的最大公约数是%dn,a,b, gxs); printf(%d和%d的最小公倍数是%dn,a,b, gbs);3、请找出十个最小的连续自然数,它们个个都是合数(非素数)#include #include int su(long m) int i,n=1; for(i=2;i=10) break; for(i=0;inum;i+) printf(%ldn,ai);4、分数比较比较两个分数的大小。*问题分析与算法设计人工方式下比较分数大小最常用的方法是:进行分数的通分后比较分子的大小。可以编程模拟手式方式。#include int zdgxs(int x,int y) int t; if(xc1) printf(%d/%d%d/%dn,a,b,c,d); else if(a1c1) printf(%d/%d%d/%dn,a,b,c,d); else printf(%d/%d=%d/%dn,a,b,c,d);5、猜数字游戏#include main() int num1,num2; srand(time(NULL); num1=rand()%100; printf(请输入一个0到100之间的整数:); scanf(%d,&num2); while(1) scanf(%d,&num2); if(num1=num2) printf(你真棒,猜对了!); break; else if(num1num2) printf(猜大了,重猜!);else printf(太小了,重猜!); 6、抓交通肇事犯一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同; 丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。*问题分析与算法设计按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。#include #include main() int num,i,j,k; for(i=1;i=9;i+) for(j=0;j=9;j+) if(i!=j) num=i*1000+i*100+j*10+j;for(k=1;k*k=num;k+)if(k*k=num)printf(num=%d,k=%dn,num,k); 7、排队把N个同学排成一排, 由前向后按1,2,1,2.报数, 报单数的走出队伍, 报双数的向前靠拢重新组成一排, 然后再1,2,1,2.报数, 报单数的走出队伍, 问剩下最后一个人时, 这个人原来在哪个位置.(N由键盘输入)#include #include struct node int data1; int data2; struct node *next;struct node * create_list(int n) struct node *head,*p,*q; int i; head=(struct node *)malloc(sizeof(struct node); head-data1=1; head-data2=1; p=head; for(i=2;idata1=i; q-data2=i; p-next=q; p=q; p-next=NULL; return(head);struct node * delete_node(struct node *head,struct node *p) struct node *q; if(p=head) head=p-next; p-next=NULL; else q=head;while(q-next!=p)q=q-next;q-next=p-next; free(p); return (head);main() struct node *head,*p,*q; int num,i; printf(请输入人数:); scanf(%d,&num); head=create_list(num); while(num1) p=head; while(p) if(p-data1)%2) q=p; p=p-next;head=delete_node(head,q); num-;else p=p-next; p=head; i=1; while(p) p-data1=i;i+; p=p-next; printf(最后剩下的人原来的位置是%dn,head-data2);8、古堡算式福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:ABCDE*?=EDCBA他对华生说:ABCDE应该代表不同的数字,问号也代表某个数字!华生:“我猜也是!于是,两人沉默了好久,还是没有算出合适的结果来。请你利用计算机的优势,找到破解的答案。把ABCDE所代表的数字写出来。#include int func(long n,int m) int num5,i=0,j; long n1=n; while(n1) numi+=n1%10; n1=n1/10; for(i=0;i4;i+) for(j=i+1;j5;j+) if (numi=numj) return 0; n1=n*m; i=4; while(n1) if(n1%10!=numi-) return 0; n1=n1/10; return 1;main() long i; int j; for(i=10000;i100000;i+) for(j=2;j10;j+) if(func(i,j) printf(%ld*%d=%dn,i,j,i*j); 9、约瑟夫问题15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一个圆圈,从第一个人开始报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问教徒怎么站,才能使每次投入大海的都是非教徒。#include #include # define M 15# define N 15struct node int data1; /int data2; struct node *next;struct node * create_list(int n) struct node *head,*p,*q; int i; head=(struct node *)malloc(sizeof(struct node); head-data1=1; /head-data2=1; p=head; for(i=2;idata1=i; /q-data2=i; p-next=q; p=q; p-next=head; return(head);struct node * delete_node(struct node *head,struct node *p) struct node *q; if(p=head) head=p-next; p-next=NULL; else q=head;while(q-next!=p)q=q-next;q-next=p-next; free(p); return (head);void print_list(struct node *head) struct node *p; printf(%5d,head-data1); p=head-next; while(p!=head) printf(%5d,p-data1);p=p-next; main() struct node *head,*p,*q; int num=M+N,n; head=create_list(M+N); p=head; while(numN) n=1; while(nnext; n+; q=p; p=p-next; head=delete_node(head,q); num-; print_list(head);10、捕鱼问题A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?#include main() int i;long num=1; for(i=1;i=5;i+) num=(num*5)+1; printf(num=%dn,num);11、出售金鱼买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸中共有几条金鱼?*问题分析与算法设计题目中所有的鱼是分五次出售的,每次卖出的策略相同;第j次卖剩下的(j+1)分之一再加1/(j+1)条。第五次将第四次余下的11条全卖了。假定第j次鱼的总数为X,则第j次留下:x-(x+1)/(j+1)当第四次出售完毕时,应该剩下11条。若X满足上述要求,则X就是题目的解。应当注意的是:(x+1)/(j+1)应满足整除条件。试探X的初值可以从23开始,试探的步长为2,因为X的值一定为奇数。*程序说明与注释#includeint main()int i,j,n=0,x; /*n为标志变量*/for(i=23;n=0;i+=2) /*控制试探的步长和过程*/for(j=1,x=i;j=11;j+) /*完成出售四次的操作*/if(x+1)%(j+1)=0) /*若满足整除条件则进行实际的出售操作*/x-=(x+1)/(j+1);else x=0;break; /*否则停止计算过程*/if(j=5&x=11) /*若第四次余下11条则满足题意*/printf(There are %d fishes at first.n,i); /*输出结果*/n=1; /*控制退出试探过程*/12、亲密数如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。*问题分析与算法设计按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。计算数a的各因子的算法:用a依次对i(i=1a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则i就不是a的因子。*程序说明与注释#includeint main()int a,i,b,n;printf(There are following friendlynumbers pair smaller than 3000:n);for(a=1;a3000;a+) /*穷举1000以内的全部整数*/ for(b=0,i=1;i=a/2;i+) /*计算数a的各因子,各因子之和存放于b*/if(!(a%i)b+=i; /*计算b的各因子,各因子之和存于n*/for(n=0,i=1;i=b/2;i+)if(!(b%i)n+=i;if(n=a&ab)printf(%4d.%4d ,a,b); /*若n=a,则a和b是一对亲密数,输出*/13.完全数如果一个数恰好等于它的因子之和,则称该数为“完全数”。*问题分析与算法设计根据完全数的定义,先计算所选取的整数a(a的取值11000)的因子,将各因子累加于m,若m等于a,则可确认a为完全数。*程序说明与注释#includeint main()int a,i,m;printf(There are following perfect numbers smaller than 1000:n);for(a=1;a1000;a+) /*循环控制选取11000中的各数进行判断*/for(m=0,i=1;i=a/2;i+) /*计算a的因子,并将各因子之和m=a,则a是完全数输出*/if(!(a%i)m+=i;if(m=a)printf(%4d ,a);printf(n);14、加密题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后除以10,用余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。编程实现输入一个电话号码,得到加密后的数字。1.程序分析:2.程序源代码:#include main()int a,i,aa4,t;scanf(%d,&a);aa0=a%10;aa1=a%100/10;aa2=a%1000/100;aa3=a/1000;for(i=0;i=3;i+)aai+=5;aai%=10;for(i=0;i=0;i-)printf(%d,aai);15、巧夺偶数桌子上有25颗棋子,游戏双方轮流取子,每人每次最少取走一颗棋子,最多可取走3颗棋子。双方照这样取下去,直到取光所有的棋子。于是双方手中必然一方为偶数,一方为奇数,偶数方为胜者。请编程实现人机游戏。#include stdio.hmain()int a, s, w, i;a = 25;s = 0;w = 0;while( a != 0)i= rand()%3 + 1;printf(这次机器取的粒数是:%dn,i); if( a i)s = s + i; a = a - i; else s = s + a; a = 0; while(1) printf(请输入你这次要取的粒数:);scanf(%d,&i);if(i=1) break;else printf(输入不正确,请重新输入13之间的数:n); if( a i)w = w + i; a = a - i;elsew = w + a;a = 0;printf(你一共取的粒数是:%d,机器一共取的粒数是:%d,w,s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论