C语言经典编程题.docx
- 文档编号:27699708
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:19
- 大小:20.77KB
C语言经典编程题.docx
《C语言经典编程题.docx》由会员分享,可在线阅读,更多相关《C语言经典编程题.docx(19页珍藏版)》请在冰豆网上搜索。
C语言经典编程题
“蓝桥杯”软件大赛练习题
求素数
最大公约数
和最小公倍数
连续自然数
分数比较
猜数字游戏
抓交通肇事犯
古堡算式
约瑟夫问题
捕鱼问题
出售金鱼
亲密数
完全数
加密
巧夺偶数
数字移动
1、求101~200之间一共有多少个素数
#include<>
#include<>
intsu(intm)
{
inti,n=1;
for(i=2;i<=sqrt(m);i++)
if(m%i==0)
{
n=0;break;
}
returnn;
}
main()
{
inti,num=0;
for(i=101;i<=200;i++)
if(su(i))num++;
printf("101~200之间素数个数是%d",num);
}
2、求最大公约数和最小公倍数
#include<>
intzdgxs(intx,inty)
{
intt;
if(x { t=x;x=y;y=t; } t=x%y; while(t) { x=y; y=t; t=x%y; } returny; } intzxgbs(intx,inty) { return(x*y/zdgxs(x,y)); } main() { inta,b,gxs,gbs; printf("pleaseinputtwonumbers: "); scanf("%d%d",&a,&b); gxs=zdgxs(a,b); gbs=zxgbs(a,b); printf("%d和%d的最大公约数是%d\n",a,b,gxs); printf("%d和%d的最小公倍数是%d\n",a,b,gbs); } 3、请找出十个最小的连续自然数,它们个个都是合数(非素数) #include<> #include<> intsu(longm) { inti,n=1; for(i=2;i<=sqrt(m);i++) if(m%i==0) { n=0;break; } returnn; } main() { intnum=0; longi,a[10]; for(i=1;;i++) { if(! su(i)) a[num++]=i; else num=0; if(num>=10)break; } for(i=0;i printf("%ld\n",a[i]); } 4、分数比较 比较两个分数的大小。 *问题分析与算法设计 人工方式下比较分数大小最常用的方法是: 进行分数的通分后比较分子的大小。 可以编程模拟手式方式。 #include<> intzdgxs(intx,inty) { intt; if(x { t=x;x=y;y=t; } t=x%y; while(t) { x=y; y=t; t=x%y; } returny; } intzxgbs(intx,inty) { return(x*y/zdgxs(x,y)); } main() { inta,b,c,d,gbs,a1,c1; printf("请输入第一个数的分子和分母: "); scanf("%d%d",&a,&b); printf("请输入第二个数的分子和分母: "); scanf("%d%d",&c,&d); printf("你所输入的两个分数是%d/%d,%d/%d\n",a,b,c,d); gbs=zxgbs(b,d); a1=gbs/b*a; c1=gbs/d*c; if(a1>c1)printf("%d/%d>%d/%d\n",a,b,c,d); elseif(a1 elseprintf("%d/%d=%d/%d\n",a,b,c,d); } 5、猜数字游戏 #include<> main() { intnum1,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(num1 "); elseprintf("太小了,重猜! "); } } } 6、抓交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。 现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。 甲说: 牌照的前两位数字是相同的;乙说: 牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说: 四位的车号刚好是一个整数的平方。 请根据以上线索求出车号。 *问题分析与算法设计 按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。 #include<> #include<> main() { intnum,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=%d\n",num,k); } } 7、排队 把N个同学排成一排,由前向后按1,2,1,2......报数,报单数的走出队伍,报双数的向前靠拢重新组成一排,然后再1,2,1,2......报数,报单数的走出队伍,问剩下最后一个人时,这个人原来在哪个位置.(N由键盘输入) #include<> #include<> structnode { intdata1; intdata2; structnode*next; }; structnode*create_list(intn) { structnode*head,*p,*q; inti; head=(structnode*)malloc(sizeof(structnode)); head->data1=1; head->data2=1; p=head; for(i=2;i<=n;i++) { q=(structnode*)malloc(sizeof(structnode)); q->data1=i; q->data2=i; p->next=q; p=q; } p->next=NULL; return(head); } structnode*delete_node(structnode*head,structnode*p) { structnode*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() { structnode*head,*p,*q; intnum,i; printf("请输入人数: "); scanf("%d",&num); head=create_list(num); while(num>1) { 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("最后剩下的人原来的位置是%d\n",head->data2); } 8、古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说: ABCDE应该代表不同的数字,问号也代表某个数字! 华生: “我猜也是! 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把ABCDE 所代表的数字写出来。 #include<> intfunc(longn,intm) { intnum[5],i=0,j; longn1=n; while(n1) { num[i++]=n1%10; n1=n1/10; } for(i=0;i<4;i++) for(j=i+1;j<5;j++) { if(num[i]==num[j])return0; } n1=n*m; i=4; while(n1) { if(n1%10! =num[i--])return0; n1=n1/10; } return1; } main() { longi; intj; for(i=10000;i<100000;i++) for(j=2;j<10;j++) if(func(i,j)) printf("%ld*%d=%d\n",i,j,i*j); } 9、约瑟夫问题 15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法: 30个人围成一个圆圈,从第一个人开始报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。 问教徒怎么站,才能使每次投入大海的都是非教徒。 #include<> #include<> #defineM15 #defineN15 structnode { intdata1; 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=1~a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则i就不是a的因子。 *程序说明与注释 #include<> intmain() { inta,i,b,n; printf("Therearefollowingfriendly–numberspairsmallerthan3000: \n"); for(a=1;a<3000;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&&a printf("%4d..%4d",a,b);/*若n=a,则a和b是一对亲密数,输出*/ } } 13.完全数 如果一个数恰好等于它的因子之和,则称该数为“完全数”。 *问题分析与算法设计 根据完全数的定义,先计算所选取的整数a(a的取值1~1000)的因子,将各因子累加于m,若m等于a,则可确认a为完全数。 *程序说明与注释 #include<> intmain() { inta,i,m; printf("Therearefollowingperfectnumberssmallerthan1000: \n"); for(a=1;a<1000;a++)/*循环控制选取1~1000中的各数进行判断*/ { 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() {inta,i,aa[4],t; scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i<=3;i++) {aa[i]+=5; aa[i]%=10; } for(i=0;i<=1;i++) {t=aa[i]; aa[i]=aa[3-i]; aa[3-i]=t; } for(i=3;i>=0;i--) printf("%d",aa[i]); } 15、巧夺偶数 桌子上有25颗棋子,游戏双方轮流取子,每人每次最少取走一颗棋子,最多可取走3颗棋子。 双方照这样取下去,直到取光所有的棋子。 于是双方手中必然一方为偶数,一方为奇数,偶数方为胜者。 请编程实现人机游戏。 #include"" main() { inta,s,w,i; a=25; s=0; w=0; while(a! =0) { i=rand()%3+1; printf("这次机器取的粒数是: %d\n",i); if(a>i) { s=s+i; a=a-i; } else { s=s+a; a=0; } while (1) { printf("请输入你这次要取的粒数: "); scanf("%d",&i); if(i<=3&&i>=1)break; elseprintf("输入不正确,请重新输入1~3之间的数: \n"); } if(a>i) { w=w+i; a=a-i; } else { w=w+a; a=0; } } printf("你一共取的粒数是: %d,机器一共取的粒数是: %d,",w,s); if(w%2==0) printf("所以你赢了\n"); elseprintf("所以你输了\n"); } 16数字移动 在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是: 只能将数字沿线移向空白的点.请编程显示数字移动过程。 #include<> inta[8]={0,1,2,5,8,7,6,3}; intb[9]; intc[8]; intcount=0; voidshow_screen() { inti; printf("第%2d次移动\n",count++); for(i=0;i<9;i++) if(i%3==2)printf("%2d\n",b[i]); elseprintf("%2d",b[i]); } intmain() { inti,j,k,t; voidshow_screen(); printf("请输入8个1~8之间的数字: \n"); for(i=0;i<8;i++) scanf("%d",&b[a[i]]); show_screen(); t=-1; for(j=0;j<8;j++) { if(b[a[j]]==1) { t=j;break; } } for(j=0;j<8;j++) c[j]=a[(j+t)%8]; for(i=2;i<9;i++)//i: 正在处理的数字, for(j=i-1;j<8;j++) if(b[c[j]]==i&&j! =i-1) { b[4]=i; b[c[j]]=0;show_screen(); for(k=j;k! =i-1;k--) { b[c[k]]=b[c[k-1]]; b[c[k-1]]=0; show_screen(); } b[c[k]]=i; b[4]=0; show_screen(); } elseif(b[c[j]]==i)break;//数字i在正确的位置 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 经典 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)