OJ刷题21-30
OJ刷题21-3021.累加式问题描述累加式对于明明来说是一个全新的概念他在数学课上第一次听到了这个名词。可是明明在课堂上并没有完全明白于是回家后明明就问他爸爸什么是累加式。明明的爸爸是一位数学家自然对累加式非常熟悉告诉明明“累加式是一种表达式这种表达式的构成方法是这样的从1开始加其后的每一个数都比前一个数大1然后加到某一个数后停止递增之后每加的一个数都比前一个数小1一直加到1为止这样构成的一个表达式称为累加式。 例如1234321就是一个累加式它从1开始加到4然后再加到1完成累加的过程。”明明对他爸爸的回答相当满意于是想构造更多的累加式出来可是明明又不想过于辛苦他来求助于你帮他写一个程序完成累加式的构造。 明明的问题可以归结为给你一个正整数n完成从1到n再到1的累加式的构造。#includestdio.h//累加式 1 2 3 4 54...intmain(){intn,i,j;while((scanf(%d,n))1){for(i1;in;i){if(i1){printf();}printf(%d,i);}for(jn-1;j1;j--){printf(%d,j);}printf(\n);}return0;}22.约瑟夫环问题2明明是一名公安局的谈判专家专门负责和绑匪谈判。有一次明明接到一个特殊的任务他赶到了案发现场发现有k个绑匪绑架了k个人质于是明明就开始和绑匪进行谈判。绑匪提出了一个非常特殊的要求如果明明能够回答出这个问题那绑匪将释放所有的人质否则绑匪就要撕票。 绑匪的问题是这样绑匪把人质和自己围成一个圈把人质从1开始编号一直编到k然后绑匪自己从k1开始编号一直编到2k。现在从编号1开始每次从其中选出第m个人隔m-1选出一个人出列然后绑匪要求明明选定这个m值且m值要尽量的小使得最先出列的k个人都是绑匪。 例如有3个坏人和3个人质他们排成一圈其中编号1到3的为人质编号4到6的为坏人如下 1、2、3、4、5、6 明明要选定m5时能够满足绑匪的要求。因为 第一轮从1开始数编号5出列剩下的人为 1、2、3、4、6 第二轮从6开始数编号4出列剩下的人为 1、2、3、6 第三轮从6开始数编号6出列剩下的人为 1、2、3 这样所有的绑匪都先出列明明可以成功地救出所有的人质。 如果明明能够找到这个m值那么所有的人质都想获救否则的话后果不堪设想。明明意识到了问题的严重这个问题对他来说十分地棘手。于是明明想到了你你是一名程序设计专家明明想让你用程序来解这个问题救出所有的人质。 明明的问题可以归结为假设有k个人质和k个绑匪围成一圈。人质的编号从1到k绑匪的编号从k1到2k。从编号1开始每次从其中选出第m个人(隔m-1选出一人)出列。希望求出m的最小值使得最先出列的k个人都是绑匪即都是编号从k1到2k的人。#includestdio.h//约瑟夫环问题2intcheck(intk,intm){inti;intpos;//记录开始下标intpeople;//初始总人数人质是1~k绑匪是 k1 ~ 2kpeople2*k;pos0;for(i0;ik;i){pos(posm-1)%people;//people为当前总人数if(posk)//抓到了人质失败返回0{return0;}people--;//没有抓到人质总人数-1}return1;}intmain(){intk,m;while(scanf(%d,k)!EOF)//不是 0{mk1;//必须从k1开始若 m k则第一次就会抓到人质while(1){if(check(k,m)){printf(%d\n,m);break;}m;}}return0;}23.整数的尾数一个整数只知道前几位为a不知道末二位被另一个整数b除尽了那么该数的末二位该是什么呢#includestdio.h//整数的尾数intmain(){inta,b,x,T,number,i,full,first;first0;scanf(%d,T);while(T--){first0;scanf(%d %d,a,b);//number a*100;for(i0;i100;i){numbera*100i;if(number%b0){if(first1)//不是第一组输出 输出空格{printf( );}printf(%02d,i);//控制为两位9补成09first1;//已有1一组数据标记下次}}printf(\n);}return0;}24.回文质数因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的)所以 151 号是回文质数。写一个程序来找出范围[a,b](5 a b 100,000)间的所有回文质数//24回文质数#includestdio.h#includemath.h//判断质数intisPrime(intn){inti,j;jsqrt(n);for(i2;ij;i){if(n%i0){return0;}}return1;}//判断回文数intisHuiwen(intm){intoriginal,reversed,i;originalm;reversed0;while(m!0){reversedreversed*10m%10;mm/10;}if(reversedoriginal){return1;}else{return0;}}intmain(){inti,a,b;scanf(%d %d,a,b);for(ia;ib;i){if((isPrime(i)!0)(isHuiwen(i)!0)){printf(%d\n,i);}}return0;}25.汽水瓶有这样一道智力题“某商店规定三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶她最多可以换多少瓶汽水喝”答案是5瓶方法如下先用9个空瓶子换3瓶汽水喝掉3瓶满的喝完以后4个空瓶子用3个再换一瓶喝掉这瓶满的这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水喝掉这瓶满的喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶最多可以换多少瓶汽水喝//25汽水瓶//本质是每换一瓶损失三个瓶子实际上空瓶减少2个瓶 所以只需要考虑最大换的数量即n/2#includestdio.hintmain(){intn,max;while(scanf(%d,n)n!0){maxn/2;if(n1){printf(0\n);}else{printf(%d\n,max);}}return0;}26.阶乘最后非零位N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大如13!就必须用32位整数类型来存储70即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!12345120所以5!的最后面的非零位是2712345675040所以最后面的非零位是4。//26阶乘最后的非0位难#includestdio.hintmain(){longlongN,res;inti;res1;scanf(%lld,N);//scanf(%d,N)就会超时//while(scanf(%d,N) ! EOF)//傻了只有一个N//{for(i2;iN;i){resres*i;while(res%100){resres/10;}resres%100000;//关键步骤防止res太大如果没有这行就会超时}printf(%lld\n,res%10);//对10取余就是最后一位非零10010*10....//}return0;}27.算菜价妈妈每天都要出去买菜但是回来后兜里的钱也懒得数一数到底花了多少钱真是一笔糊涂帐。现在好了作为好儿子女儿的你可以给她用程序算一下了呵呵。//27算菜价#includestdio.h#includemath.hintmain(){intt,n,i;//测试组数种类数量charname[30];doublenum,price,total;scanf(%d,t);//测试组数while(t--){scanf(%d,n);total0;for(i1;in;i){scanf(%s %lf %lf,name,num,price);totaltotalprice*num;}//total (int)(total*10 0.5)/10.0;//四舍五入法1totalround(total*10)/10.0;//四舍五入法2直接使用函数printf(%.1f\n,total);//精度为角单价是元控制输出保留一位小数}return0;}28.算水果价格一家水果店出售四种水果每公斤价格的苹果代码为a1.5元橘子代码为o1.4元香蕉代码为b1.48元菠萝代码为p1.08元。编一个程序使售货员只要在键盘上打入货品的代码及重量计算机将显示货品名、单价、重量及总价。输入说明你的程序需要从标准输入设备通常为键盘中读入多组测试数据。每组测试数据的第一行为一个整数m表示有m件货品要被购买。在接下来的m行中每行输入两个值dg。d表示货品的代码g表示重量。两组数据之间没有多余的空行。输出说明对每组测试数据你的程序需要向标准输出设备通常为启动该程序的终端依次输出一组对应的答案。对应每组输入输出货品名、单个总价及全部总价。具体格式参照样例输出:第一行apple前为7个空格之后为2个空格其他水果名后都是1个空格sum后没有空格第二行price后有2个空格其后关于价格的表示多为占7格2位小数且左对齐但其中pineapple为占10格2位小数且左对齐注意sum的价格仍然占7格如第一组样例中的54.60后还有2个空格第三行weight后有1个空格其后的数据与第二行一致。每两组数据之间有一个空行最后一组测试数据之后没有空行。//28算菜价 比较麻烦很容易看错细心点注意输出格式#includestdio.h#includemath.hintmain(){intm,n,first;doublewa,wo,wb,wp;//四种水果重量doublepa,po,pb,pp;//四种水果总价格doubleall_cost,all_weight;chard;//代码doubleg;//重量first1;//第一组后输出空行//读取水果种数//scanf(%d,m);while(scanf(%d,m)!EOF){wa0,wo0,wb0,wp0;while(m--){scanf( %c %lf,d,g);// %c前面空格跳过换行,重要if(da){wawag;}elseif(do){wowog;}elseif(db){wbwbg;}elseif(dp){wpwpg;}}pawa*1.5;powo*1.4;pbwb*1.48;ppwp*1.08;all_costpapopbpp;all_weightwawowbwp;if(first0){printf(\n);}first0;printf( apple orange banana pineapple sum\n);printf(price %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f\n,pa,po,pb,pp,all_cost);//-为左对齐7为占7个格.2f为保留2位小数printf(weight %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f\n,wa,wo,wb,wp,all_weight);}return0;}29.奇数乘积问题描述给你n个整数求他们中所有奇数的乘积。输入说明输入数据包含两行第一行为一个数为n表示第二行将输入n个整数。你可以假设这n个数据中必定至少存在一个奇数。//28求奇数乘积#includestdio.hintmain(){intn,num,res;res1;scanf(%d,n);while(n--){scanf(%d,num);if(num%2!0){resres*num;}}printf(%d,res);return0;}30.最早最晚日期问题描述输入N个日期每个以年、月、日的顺序读入打印输出最晚的日期、最早的日期。输入说明你的程序需要从标准输入设备通常为键盘中读入多组测试数据。每组输入数据由多行组成。每组测试数据的第一行输入一个整数N(0N20)表示有N个日期。其后N行每行有三个整数Y(1≤Y≤2015)M(1≤M≤12)D(1≤D≤31)表示一个日期。//30求最早日期最晚日期 细心#includestdio.hintmain(){intn,i;inty,m,d,y1,m1,d1;intminy,minm,mind;intmaxy,maxm,maxd;while(scanf(%d,n)!EOF){scanf(%d %d %d,y1,m1,d1);//以第一组日期为基准minyy1;maxyy1;minmm1;maxmm1;mindd1;maxdd1;for(i1;in;i){scanf(%d %d %d,y,m,d);//每组比较大if(ymaxy){maxyy;maxmm;maxdd;}elseif(ymaxy){if(mmaxm)//年份相同月份大的大{maxmm;maxdd;}elseif((mmaxm)(dmaxd))//年份相同月份相同日大的大{maxdd;}}//每组比较小if(yminy){minyy;minmm;mindd;}elseif(yminy){if(mminm)//年份相同月份小的小{minmm;mindd;}elseif((mminm)(dmind))//年份相同月份相同日小的小{mindd;}}}printf(%d %d %d\n,maxy,maxm,maxd);printf(%d %d %d\n,miny,minm,mind);}return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412598.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!