1、C语言经典编程题“蓝桥杯”软件大赛练习题求素数最大公约数和最小公倍数连续自然数分数比较猜数字游戏抓交通肇事犯古堡算式约瑟夫问题捕鱼问题出售金鱼亲密数完全数加密巧夺偶数数字移动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、求最大公约数和最小公倍数
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
3、和%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); e
4、lse 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 pri
5、ntf(太小了,重猜!); 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*10
6、00+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
7、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=h
8、ead; 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-da
9、ta1=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;i
10、4;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个人围成一个圆圈,从第一个人开始报数,每
11、数到第九个人就将他扔入大海,如此循环进行直到仅余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;
12、 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) st
13、ruct 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五个人在某天夜里合伙去
14、捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,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、出售金鱼买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次
15、卖出余下的五分之一加五分之一条;最后卖出余下的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
16、(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本身)之和
17、等于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+)
18、/*穷举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为完全数。*程序说明与注释#inc
19、ludeint 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,用余数代替该数
20、字,再将第一位和第四位交换,第二位和第三位交换。编程实现输入一个电话号码,得到加密后的数字。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颗棋子。双方照这样取下去,直到取光所有的棋子。于是双方手中必然一方为偶数,一方为奇数,偶
21、数方为胜者。请编程实现人机游戏。#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
22、; a = a - i; else w = w + a; a = 0; printf(你一共取的粒数是:%d,机器一共取的粒数是:%d,w,s); if( w%2=0 ) printf(所以你赢了n); else printf(所以你输了n);16数字移动在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.请编程显示数字移动过程。#includeint a8=0,1,2,5,8,7,6,3; int b9; int c8; int count=0; void show_scre
23、en() int i; printf(第%2d次移动n,count+); for(i=0;i9;i+) if(i%3=2) printf(%2dn,bi); else printf(%2d,bi);int main() int i,j,k,t;void show_screen();printf(请输入8个18之间的数字:n);for(i=0;i8;i+) scanf(%d,&bai);show_screen();t=-1;for(j=0;j8;j+) if(baj=1) t=j;break; for(j=0;j8;j+) cj=a(j+t)%8;for(i=2;i9;i+) /i:正在处理的数字, for(j=i-1;j8;j+) if(bcj=i&j!=i-1) b4=i; bcj=0;show_screen(); for(k=j;k!=i-1;k-) bck=bck-1; bck-1=0; show_screen(); bck=i; b4=0; show_screen(); else if(bcj=i) break; /数字i在正确的位置
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1