c++r语言条件求和 求满足以下条件的数: 该数大于100小于1000; 其个位数与十位数的平方和等其百位数的立方

当前位置:
文件名称:pingfanghuiwenshu
所属分类:
标签属性:
上传时间:
文件大小:
浏览/下载:
116次 / 0次
提 供 者:
相关连接:
下载说明:
别用迅雷下载,失败请重下,重下不扣分!
VS2010下win32平台输出大于100小于1000的平方回文数-output the square palindrome number
(系统自动生成,下载前可以参看下载内容)下载文件列表
pingfanghuiwenshu/
pingfanghuiwenshu/Debug/
pingfanghuiwenshu/Debug/pingfanghuiwenshu.exe
pingfanghuiwenshu/Debug/pingfanghuiwenshu.ilk
pingfanghuiwenshu/Debug/pingfanghuiwenshu.pdb
pingfanghuiwenshu/ipch/
pingfanghuiwenshu/ipch/pingfanghuiwenshu-9dbe2abf/
pingfanghuiwenshu/ipch/pingfanghuiwenshu-9dbe2abf/pingfanghuiwenshu-c1031ed6.ipch
pingfanghuiwenshu/pingfanghuiwenshu/
pingfanghuiwenshu/pingfanghuiwenshu.sdf
pingfanghuiwenshu/pingfanghuiwenshu.sln
pingfanghuiwenshu/pingfanghuiwenshu.suo
pingfanghuiwenshu/pingfanghuiwenshu/Debug/
pingfanghuiwenshu/pingfanghuiwenshu/Debug/cl.command.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/CL.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/CL.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link-cvtres.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link-cvtres.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6032-cvtres.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6032-cvtres.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6032.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6032.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6152-cvtres.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6152-cvtres.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6152.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.6152.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.command.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/link.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/mt.command.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/mt.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/mt.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.exe.embed.manifest
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.exe.embed.manifest.res
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.exe.intermediate.manifest
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.lastbuildstate
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.log
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.obj
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.vcxprojResolveAssemblyReference.cache
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/pingfanghuiwenshu_manifest.rc
pingfanghuiwenshu/pingfanghuiwenshu/Debug/rc.command.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/rc.read.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/rc.write.1.tlog
pingfanghuiwenshu/pingfanghuiwenshu/Debug/vc100.idb
pingfanghuiwenshu/pingfanghuiwenshu/Debug/vc100.pdb
pingfanghuiwenshu/pingfanghuiwenshu/pingfanghuiwenshu.cpp
pingfanghuiwenshu/pingfanghuiwenshu/pingfanghuiwenshu.vcxproj
pingfanghuiwenshu/pingfanghuiwenshu/pingfanghuiwenshu.vcxproj.filters
pingfanghuiwenshu/pingfanghuiwenshu/pingfanghuiwenshu.vcxproj.user
暂无评论内容.
*快速评论:
和说明不符
不是源码或资料
纯粹是垃圾
*内  容:
*验 证 码:
搜珍网是交换下载平台,下载的内容请自行研究使用或咨询上传人.
资源属性分别代表:系统平台,开发平台,开发语言,文件格式四部分.
本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用进行解压.
如果您发现此软件无法下载,请稍后再次尝试;或者.
本站提供下载的内容为网上收集或会员上传提供,若无意中侵犯了您的版权,.
如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
如下载后发现下载的内容跟说明不相乎,可以联系本站的客服,经确认可以退回消费了的积分.
联系我们网站
·电话:(0)
搜珍网 www.dssz.com
All Rights Reserved.用C++求整数平方和
题目:已知正整数n,m,&(1&=n&=m&100)。求[n,m]区间内能被7整除的数的平方和。例如n,m分别为1,10时,能被7整除的数有7,所以满足条件的值为49
输入:标准输入,第一行包含一个正整数k(1&=k&=100),表示用例的个数,接下来n行,每行两个正整数n,m,表示对应的解题区间。
输出:标准输出,每行输出一个用例结果,即对应区间内能被7整除的数的平方和。
样例输入2&&1&10&&10&50输出49&&6811
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置:首页 >
校本教材:算法练习入门(c++)第一版2014
来源:暂无&
作者:金山中学&
发表时间: 13:05&
浏览次数:1125 次&
算法练习指导系列
(第一版)
顾岑& 编著
二〇一一年十月 初稿
二〇一四年四月& 第一版
本书是作为一本实验指导教材进行整理的。虽然跟着这些实验一步一步下来,你可以学到C语言中基本的语法和简单的算法,但如果想要更准确地学习各知识点,你应该借助于一些较为正式的教材,它们将会更系统、更规范和全面。推荐纪磊的《啊哈C!思考快你一步》,和谭浩强教授的《C程序设计》。前者适合入门阶段,语言幽默风趣;后者较为全面,比较完整地讲解了C语言。
编程环境:
计算机能直接执行的程序是二进制的代码。我们所编写的程序,是一些遵循接近自然语言的计算机语言(比如VB,C,Pascal,JAVA等)编写的文本文件。你可以使用windows里的记事本去编写,然后用编译程序把这些文本文件转换成计算机可以执行的二进制文件。使用编程环境(准确一些的名字应该是IDE,Integrated Development Environment集成开发环境)会让程序的编写、编译更方便一些,它们提供了许多功能,可以提高学习、开发的效率。诸如Turbo Pascal,Visual Basic这些都属于IDE。对于本书,推荐使用Dev-C++ 4.9.9.2作为windows下C/C++的学习环境。你也可以在网站使用在线的ide开发环境。
OJ(Online Judge)
Online Judge系统是一个在线的判题系统。用户可以在线提交程序多种程序(如C、C++)源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。(百度百科)
本书中的习题都可以在金山中学信息学工作室的在线测试平台上提交。对此,你只需要一台可以上网的终端设备。可以是PC、也可以是平板电脑甚至手机。当然,编写程序是要敲击键盘的,PC会是最方便的。金中OJ的网址是:,你可以在学校或家里使用它。
为了保持一个循序渐进的过程,参考代码未必是某一问题的最优解。
为了使初学者较轻松阅读代码,参考代码也没有采用较为精炼的写法。
虽然提供了部分参考代码,但是不希望的你变成一个“打字员”,学算法、学程序设计,不好好开动脑筋是不行的。
初识C语言程序
一段简单的C语言程序
#include &stdio.h&
int main( )
& printf(“%d”,1+2);
& return 0;
你可以在Dev-C++中“新建源代码”后输入上述语句,存盘并“编译运行”(按快捷键F9)以上程序。如果你眼睛比较尖的话,可以发现有一个窗口一闪而过,这个窗口叫做控制台窗口,该窗口会在程序执行完毕之后自动关闭。那么输出的结果呢?怎样去观察程序的执行结果呢?你可以强迫程序在结束之前停下来:在return 0;之前插入一个空行,增加语句:
system(“pause”);
这个语句可以让程序暂停下来。system()函数在头文件stdlib.h里声明,为了让system()函数能运行,你还需要把这个头文件包含进来,在第一行之后增加一行:
#include &stdlib.h&
增加好这两行,重新按F9,如果没有拼写错误的话,已经可以看到程序的执行结果。
  这样加入system(“pause”)的方法常用、但不是非常规范,本书后续练习的参考代码将不会写上它们,调试程序的过程中,你需要自行增加这两行。有了这语句,可以让你方便地看到程序运行的结果。当然,若你的程序调试正确无误之后,或打算把代码提交到OJ上面之前,请务必记得将这两行“小尾巴”割掉。
成功运行了这个C语言的程序之后,让我们回过头来看看这些代码都代表什么意思:
#include &stdio.h&&&&&&&&&&&&&& /* 包含头文件stdio.h &&&&&&&&&&& */
#include &stdlib.h&& &&&&&&&&&& /* 包含头文件stdlib.h&&&&&&&&&&& */
int main( )&&&&&&&&&&&&&&&& /* 主函数名,程序入口&&&&&&&&&&&& */
{&&&&&&&&&&&&&&&&&&&&&&&&&& /* 主函数体开始&&&&&&&&&&&&&&&&& */
& printf(“%d”,1+2);&&&&&&&& /* 输出一个整数,值为1+2&&&&&&&&& */
& system(“pause”);&&&&&&&&&&&&& /* 系统暂停,等待用户按任一键继续& */
& return 0;&&&&&&&&&&&&&&&& &&& /* 结束,并返回0,表示程序正确执行 */
}&&&&&&&&&&&&&&&&&&&&&&&&&& /* 主函数体结束&&&&&&&&&&&&&&&&& */
接下来,我们尝试着修改上面的程序,来完成以下几个实验:
输出的结果
输出的结果
输出 的结果
输出 的结果
发现问题没有?我们理想中输出答案应该为1.8,而实际输出的是什么呢?仅仅是1!为什么?症结出在数据类型上。计算机中整数与实数(我们可以理解为带小数的数)是不同的存储形式,所以输入、运算、输出过程中都要明确数据的类型。尝试一下四个语句,哪一个可以得到正确的结果,自己试图分析原因。
printf(“%d”,9/5);
printf(“%f”,9/5);
printf(“%f”,9.0/5);
printf(“%d”,9.0/5);
C语言的标准输入输出scanf()和printf()使用输入/输出字符串的形式规定了所要输出数据的格式,相关知识,请参阅有关书籍、资料或书后附表。
常量与变量
以上的练习让我们初识了C语言程序的基本样式,但是这样的一个程序只能对规定的特定表达式(如1+2)进行运算,而无法做到通用性。解决的方法就是引入“变量”,上一节程序中参与运算的值在程序运行过程中是固定不变的,像1那就只能是1,不会去变成3,这种类型的量,我们称之为“常量”。“变量”与“常量”不同,在程序运行过程中变量的值是可以改变的,我们用变量来存放需要运算的参数、中间结果和结果。
变量需要先定义,后使用,其本质上是内存中的一小块空间。根据定义的基本数据类型,会被分配1-8个字节不等的内存空间,参见书后附录。
[例题]:从键盘输入两个整数,输出它们的和。
[参考代码]:&&&&&&&&&&&&&&&&&&&&&&&&&& [说明]&&&&&&&&&&&&&&&&&&&&&&&&&
&&& #include &stdio.h&&&&&
&&& int main()&&&&
&&& & int a,b;&&&& &&&&&&&&&&&&& /* 定义a,b两个整数型(int)变量&&&&&&&&&& */
&&& & scanf("%d%d",&a,&b);& /* 输入两整数给变量a,b, 注意&a,&b的书写& */
&&& & printf("%d",a+b);&&&& /* 输出一个整数,值为a,b两个变量的和&&&&& */
&&& & return 0;&&&&
上机调试通过这段代码。有了这碗酒垫底,我们就可以大胆地去OJ上尝试一番,Let&s go!!!
输入、输出、表达式和基本运算
[入门001]加法
内  容:
输入说明:
一行两个整数a、b,取值在长整数范围内
输出说明:
一行一个整数,a与b的和。和不会超过长整数范围。
输入样例:
输出样例:
简  析:
本题与上一章两数相加的例题,大同小异。区别在于输入说明中已经提到输入值的数据范围是长整数,可参阅书后附录。参考代码如下:
&&& #include &stdio.h&&&&&
&&& int main()&&&&
&&& & long int a,b;&&&&
&&& & scanf("%ld%ld",&a,&b);&&&
&&& & printf("%ld",a+b);&&&&
&&& & return 0;&&&&
本题可能存在的问题:
是不是使用long int的数据类型就可以了?
首先我们检查一下C语言数据范围,可以确定是在long int的数据范围之内,所以scanf(“%ld”,&a)是没有问题的。往深层次思考,假设a跟b的值都是合法的长整数值,a+b的结果会是,这是一个超过长整型数据范围的值。如果面对这样的测试数据,上面的程序就会出错,你可以实验一下。
好在题目约定了结果不会超过长整数范围,不然就会麻烦一些了。
作为语法入门的题目,OJ在测试数据上没有过分苛刻,但是我们在平时解题的过程中要对数据的取值范围保持高度的警惕,并对中间结果和最终结果的数值范围作出充分合理的预计。
int? long int?
在很久以前的16位机时代,int类型只被分配了与CPU字长相同的16个二进制位,即2个字节,long int类型会被分配4字节。而现在主流的32位系统,分配给int类型的字节数与long int一样,一般都是4字节。所以,本题用int一样可以解,你可以简单认为,目前int数值范围等同long int。
然而,如果评测机的编译环境的不同,int类型有可能还是会被分配为2字节。对于长整型,所以还是用long int更好些。(JZOI没有这个问题)
[入门002]矩形面积和周长
内  容:
根据输入的长和宽,求矩形的面积和周长。
输入说明:
输入两个整数a,b。分别表示矩形的长和宽。(0&a,b&=100)
输出说明:
输出一行两个整数,分别表示矩形的面积和周长。两个整数之间保留一个空格。
输入样例:
输出样例:
简  析:
作为基础练习,本题在数据类型上没有难度,使用整数就可以。输出的时候要求在一行内输出两个整数,我们要注意在两个%d之间增加一个空格将两个值分隔开。参考代码:
&&& #include &stdio.h&&&&&&&
&&& int main()&&&&&&
&&& {&&&&&&
&&& & int a,b,s,c;&&&&&& &&&& /* 定义四个变量,a,b用以存放输入的两边长度 */
&&& & scanf("%d%d",&a,&b);&&&&& /* 输入时,两个%d之间不需要加空格 */
&&& & s=a*b;&&&&&&&&&&&&&&&& /* 计算矩形面积 */
&&& & c=a+a+b+b;&&&&&&
&&& & printf("%d %d",c,s);&& &&& /* 注意两个%d之间的空格,输出变量的值没有& */
&&& & return 0;&&&&&&
[入门003]求两数的整数商和余数
内  容:
求两数的整数商和余数
输入说明:
一行两个整数
输出说明:
一行两个整数
输入样例:
输出样例:
简  析:
首先注意数据类型,整数间的除法,而且要求的商和余数也都是整数。其次观察输入样例,可以知道这里输出的是两数相除的整数商,至于余数如何求?
1.余数=被除数 - 除数 * 整数商
2.余数=被除数 % 除数
“%”是C语言中的取余运算符,数学中一般写作“mod”。
参考代码:
& #include &stdio.h&&
& int main()&
& & int a,b;&
& & scanf("%d%d",&a,&b);&
& & printf("%d ",a/b);& &&&&&& /* 可写作一行printf("%d %d\n",a/b,a%b) */
& & printf("%d\n",a%b);&
& & return 0;&&&&&
[入门004]拆分3位数
内  容:
将输入的三位数的百位、十位、个位部分分别输出。
输入说明:
输入一个三位正整数n。(100&=n&=999)
输出说明:
输出一行三个数,即n的百位数部分,十位数部分和个位数部分,用一个空格分开
输入样例:
输出样例:
简  析:
使用整数除法、取余等运算可以解决。
[入门005]圆环的面积
内  容:
几何学中通常所说的环形就是圆环,一个大圆盘挖去一个小同心圆盘剩下的部分。
请你根据大圆盘的直径D和小圆盘的直径d,求圆环的面积。(&取3.14)
输入说明:
输入,两个实数,依次是D和d。(D&d)
输出说明:
输出,一个数,圆环的面积,保留两位小数
输入样例:
输出样例:
简  析:
同样是计算周长和面积,本题就不同于002题。首先要考虑到的就是数据类型,很明显应该使用实数,单精度浮点数或者双精度浮点数都可以,输入输出格式略有不同而已。本题另一个需要注意的地方是输出时候的“保留两位小数”。使用“%f”会有6位小数输出,这个是系统默认的,我们需要用“%.2f”的方式定义保留两位小数位。放心,会自动四舍五入。
参考代码:
&&& #include &stdio.h&&&&&&&
&&& int main()&&&&&&
&&& {&&&&&&
&&& & float D,r;&&&&&&
&&& & scanf("%f%f",&D,&d);&
&&& & printf("%.2f\n",3.14*(D*D-d*d)/4);&
&&& & return 0;&&&&&&
[入门006]梯形面积
内  容:
已知上底、下底和高,求梯形的面积
输入说明:
输入,三个整数,上底、下底和高。
输出说明:
输出,梯形的面积(保留两位小数)。
输入样例:
输出样例:
简  析:
输入的时候是整数,如何处理可以得到实数商,?
[入门007]求两数的整数商和实数商
内  容:
求两数的整数商和商,商保留两位小数
输入说明:
一行两个整数
输出说明:
两行。第一行一个数,即整数商。第二行一个数,实数商,保留2位小数。
输入样例:
输出样例:
简  析:
两个结果要分两行输出。怎样换行呢?即使用两个printf()分两行写,你还是会发现两个结果在一行里面。也许有同学会很有“创意地”在第一个结果之后增加若干个空格将第二个结果挤到第二行,我不得不遗憾地告诉你,这个也是一个错误的方法。正确的方法是什么呢?“\n”!“\n”是一个输出格式字符串,表示一个换行符。信息竞赛一般要求每行行末用回车结束,最后一行也是这样,所以不要忘记最后一行最后的“\n”,把前面两个题目修改的更规范一些吧。
[入门009]四渠灌水
内  容:
&有四条水渠依次记为 A B C D,可以向同一水池注水。给出单开一个水渠注满水池所需要的天数,请问
(1)AB两条水渠同时注水,注满需要多长时间
(2)四渠同开,注满需要多长时间
结果保留2位小数
输入说明:
一行4个数字(无单位),表示A,B,C,D四个水渠灌满池子的天数。
输出说明:
两行,第一行为AB同开,第二行为4渠同开
输入样例:
输出样例:
本章小结:
亲爱的同学,你在完成本章的练习以后,请休息一下,并且回忆本章所学习到的东西,我们学习到了:
lC语言程序的基本样式:
n#include &头文件.h&
n主函数:int main(){&&}
n完成主函数需要书写return 0,告诉操作系统,完成程序。
l数据类型:
n计算机里面整数和浮点数(带小数的数)是分别处理的,不同的数据类型还有其数据范围。
n整数类:整数型int,长整数型long int,更长的long long int
n浮点数类型:单精度float,双精度double
l标准输入输出函数scanf()、printf()
n需要头文件stdio.h的支持
n输入输出时需要格式字符串(见附录)
n从键盘输入值给变量时,变量名前需要加&
l另外我们还简单了解了怎样查看程序运行的结果,如何在OJ上答题等。
程序设计过程中,经常性会需要根据某种情况作出判断,属于该种情况的采用A方法进行处理,而不符合的便采用B方法予以处理。这种结构称为分支结构,C语言中最常见的分支结构语句是if语句:
&&& if(判断条件)
&&&&&& {A方法的语句段;}
&&&&&& {B方法的语句段;}
让我们通过练习来熟悉他们。
[入门011]求两数中的较大者
内  容:
输出两数中的较大者
输入说明:
输入两个整数a,b
输出说明:
输出一个整数,a,b中较大的那个,当然如果a,b相等,随便输出哪个都可以。
输入样例:
输出样例:
简  析:
无。参考代码如下:
&&& #include &stdio.h&&&&&&&
&&& int main()&&&&&&
&&& {&&&&&&
&&& & int a,b;&&&&&&
&&& & scanf("%d%d",&a,&b);&
&&& & if(a&b)&&&&&& &&&&&&&&& /* 注意这里没有分号 */
&&& &&&& printf("%d",a);&&&& /* 当a&b时,输出a */
&&& & else& &&&&&&&&&&&&&&&& /* 这里也没有分号,也不需要写反条件a&=b */
&&& &&&& printf("%d",b);& &&&&&& /* 当a没有能够&b时,输出b */
&&& & return 0;&&&&&&
注意if这里的四行,这是一个基本的分支结构。学习它的写法。
[入门012]判断奇偶数
内  容:
判断输入的正整数的奇偶性。
输入说明:
输入一个正整数n,(0&n&=10000)
输出说明:
输出,如果n是奇数,请输出"Odd number",如果n是偶数,请输出"Even number"。
输入样例:
输出样例:
Even number
简  析:
输出时候可以用printf("Odd number\n")和printf("Even number")。
至于怎样判断奇数?提示一下,可以使用 % 来做取余运算。
[入门013]绝对值
内  容:
负数的绝对值是它的相反数,正数和零的绝对值是它本身。
输入说明:
输入,一个数n
输出说明:
一行一个数,n的绝对值
输入样例:
输出样例:
简  析:
不要试图在C语言里面输入|a|这样的数学符号,它不认识的。考虑一下绝对值的定义:
&&& &&&&&&&&& a&& (a&=0)
&&&&&&&&&&&& -a&& (a&0)
用分支结构来实现,回顾之前的题目,独立完成本题。
[入门014]优惠购物
内  容:
节日期间,某超市举行优惠购物活动,活动规定:所购物品不超过1000元(含)时,按9.5折付款,如超过1000元,则超过部分按9折收费
输入说明:
一行,一个数,购物总额
输出说明:
一行,一个数,需付购物款(保留两位小数)
输入样例:
输出样例:
简  析:
独立分析题目,把分支、条件理清楚。注意数据类型。
[入门015]符号函数
内  容:
计算下列函数(符号函数):&&&&&&&&&&&&&& && 1&&& (x&0)&&&&&&&&&& y=&&&& 0&&& (x=0)&&&&&&&&&&&&&& & -1& & (x&0)
输入说明:
输出说明:
一个数字,y的值(1,0,或者-1)
输入样例:
输出样例:
简  析:
题目非常友好地列出了分段函数的表达式,比较纠结的是,一共有三段,怎么办?聪明的你可能早已经想到,可以用if语句先选出x&0的情况,然后在剩下的数(x&=0)中再用一次if语句把x=0的情况筛出来,那么最后剩下的就是x&0的情况了。这中分支结构包含分支结构的形式,称为分支嵌套。参考代码如下:
&&& #include &stdio.h&&
&&& int main()&
scanf("%lf",&x);&
&&& & if(x&0)&
&&& &&& y=1;&
&&& & else&
&&&&& {& &&&&& /* 作为初学者,建议加上括号明确哪些语句段属于分支执行的内容 */
&&& &&& if(x==0)& &&&&&&& /* 注意这里的==符号,与数学中的=不同 */
&&& &&&&& y=0;&
&&& &&& else&
&&& &&&&& y=-1;&
&&&&& } &&&&&& /* 作为初学者,建议加上括号明确哪些语句段属于分支执行的内容 */
&&& & printf("%d\n",y)
return 0;&&&&&
首先请特别注意if(a==0)这句,C语言中使用两个等于号“==”作为是否相等的判断符,而将一个等于号“=”作为赋值符,一定要注意这一点,非常容易犯的错误!
其次,要注意,如果条件分支上有多个语句,要使用花括号“{}”将这些语句括起来。(其实本例中不需要,但是有这对括号也不错,初学者务必注意)
[入门016]求三数中的较大者
内  容:
从输入的三个数中选择最大的那个进行输出
输入说明:
输入,一行三个整数
输出说明:
输出,三个整数中最大的那个
输入样例:
输出样例:
[入门017]一元二次方程的实数根
内  容:
求一元二次方程(二次项系统不为0)ax2+bx+c=0(a&0)的实数根
输入说明:
一行三个系数a,b,c。其中a肯定不会是0。(各个数字用空格隔开)
输出说明:
输出,若方程无实数根,输出No answer!
若方程有实数根,先输出(-b+sqrt(b*b-4*a*c))/(2*a)这个,换行后再输出另一个。
若方程两个实数根的值相同,只需输出一次。
输出的所有数值均保留两位小数。
输入样例:
输出样例:
No answer!
简  析:
关于输入,其实题目已经给的很清晰了,务必自己去理解。这里赘述如下:如果是2x2-4x+1=0,题目会依次输入2 -4 1这三个数分别表示x2,x1,x0项的系数。
初中数学应该已经学过,一元二次方程的通解公式:
根据b2-4ac值的情况不同,有三种形式的解,如题。参考代码如下:
1.& #include &stdio.h&&
2.& #include &math.h&& /* 因为要调用根号sqrt()函数,所以需要math.h */
3.& int main()&
5.& & float a,b,c,d;&
6.& & scanf("%f%f%f",&a,&b,&c);&
7.& & d=b*b-4*a*c;&
8.& & if(d&0)&
9.& &&& printf("%.2f\n%.2f\n",(-b+sqrt(d))/2/a,(-b-sqrt(d))/2/a);&
10. & else&
11. &&& if(d==0)&
12. &&&&& printf("%.2f",-b/2/a);&
13. &&& else&
14. &&&&& printf("No answer!");&
15. & return 0;&
[入门018]平面直角坐标系中点的位置
内  容:
判断一个点a(ax,ay),在平面直角坐标系中位于哪一个象限。
输入说明:
输入,两个实数ax和ay。且保证ax,ay不会为0。
输出说明:
输出,点a位于哪一个象限,第一象限输出1,第二象限输出2。
输入样例:
输出样例:
简  析:
注意数据类型。
[入门019]流量费
内  容:
每到月底,都是小强最凌乱的时候,流量不够用了,有木有!
可怜见,小强只有5块钱30M的流量包!而10086说,超出部分是按0.001元/KB收费的。
输入说明:
输入,小强某个月份使用的数据流量。
输出说明:
输出,小强为这些流量需要支付的钱。
输入样例:
输出样例:
[入门020]判断直角三角形
内  容:
输入三条边的长,判断这三条边能否组成直角三角形。
输入说明:
一行,输入3个整数
输出说明:
输出,如果能够组成直角三角形,输出YES
如果能够组成三角形,但是组成的三角形不是直角三角形,输出NO
如果连三角形都不能组成,输出ERROR
输入样例:
输出样例:
简  析:
对于直角三角形的判断,我们都可以想到a2+b2=c2。但是,对于输入的一行三个整数,哪一个是斜边呢?其次在判断是否直角三角形之前,我们还要先判断三角形是否成立。综合考虑之后,我们可以得出这样一个思路:
&&& 首先:找出斜边(最长的那条边)
&&& 其次:判断三角形是否成立,若成立去第三步,不成立则输出Error
&&& 第三:在已经判定是三角形(第二步)的前提下,继续判断是否直角三角形,对应输出
参考代码如下:
1.& #include &stdio.h&&
2.& main()&
4.& && int a,b,c,t;&
5.& && scanf("%d%d%d",&a,&b,&c);&
6.& && if(a&b)& { t=a;a=b;b=t;}& /* 如果a&b,交换a,b的值,确保a&b */
7.& && if(a&c)& { t=a;a=c;c=t;}& && /* 如果a&c,交换a,c的值,确保a&c */
8.& && &&&&&&& /* 经过上面两行,我们确保a&b且a&c,a就是最长的那条边 */&
9.& && if(a&=(b+c))&
10. &&&&& printf("Error!\n");& &&&&& /* 不构成三角形 */
11. && else&
12. &&&&& if(a*a==b*b+c*c)&
13. &&&&&&& printf("Yes!\n");& &&&&& /*& 直角三角形& */
14. &&&&& else&&
15. &&&&&&& printf("No!\n") ;& &&&&& /* 非直角三角形 */
16. && return 0;&
为便于讲解,本题在代码左方增加行号(行号不必输入)。
分支结构if语句可以没有else,称为单分支,如第六第七行。
else会寻找上方最近的那个if配对,组成一个双分支结构,所以跟第11行的else配对的是第9行的if。
读懂题意,分析思考。对问题分步解决,这是算法题经常采用的解题过程。
[入门021]闰年判断
内  容:
一年有多少天?365么?这不科学!
地球绕日运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日,这一年就为闰年。需要注意的是,现在的公历是根据罗马人的“儒略历”(由Jules C&sar,凯撒所定立)改编而得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格列高利十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。
此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。
闰年的计算,归结起来就是通常说的:四年一闰;百年不闰;四百年再闰。
①、普通年能整除4且不能整除100的为闰年。(如2016年是闰年,2011年不是闰年)
②、世纪年能整除400的是闰年。(如2000年是闰年,1900年不是闰年)
输入说明:
输入,公历年份year,(year&0)
输出说明:
输出,如果year是闰年,输出Leap Year
如果year是平年,输出Common Year
输入样例:
输出样例:
本章小结:
亲爱的同学,分支结构可以让计算机程序根据不同的情况,选择不同的代码段予以执行。你需要事先分析题目,把情况逐一列出,写下各种情况的判定关系式,并且分清楚各种情况之间的包含关系。要保持思路的清晰。
分支的条件,会涉及逻辑运算,建议阅读一些相关的书籍。另外在C语言里面数值0表示逻辑假(false),其他非0数值都可以代表逻辑真(true)。
&&& if(你累了)
&&&&&& 休息吧;
&&&&&& 休息一下;
&&&&&& 继续学习;
我们用循环结构来进行重复的操作。
C语言有三种常见的循环语句,我们称它们为for循环、while循环、do-while循环。
C语言中的for语句相当灵活,基本句式如下:
for(statement1; statement2; statement3)
&&& 循环体;
这里,statement1、statement2和statement3是一般的语句。其中statement2应具有布尔类型返回值(即返回一个逻辑值),当statement2为真时,会执行循环;当statement2为假时,即跳出循环。这段语句的执行流程如下:
第1步:执行statement1语句。
第2步:判断statement2的返回值。如果为真(非0值),转到第3步执行循环体;     & 如果不为真(0值)则离开循环,转到for循环之后的语句。
第3步:执行循环体。
第4步:执行statement3,转到第2步。
[入门031]数列求和:计算1+2+3+4+......+n之和
内  容:
计算1+2+3+4......+n之和
输入说明:
输出说明:
输入样例:
输出样例:
简  析:
本题可以直接用高斯公式求解,求解过程中需要注意整数运算的问题,我也比较赞同直接用数学公式得出结果,那是最有效率的方法。但在这里,用本题来引出循环结构:
#include &stdio.h&&
int main()&
&& int i,s=0,n;&
&& scanf("%d",&n);&
&& for(i=1;i&=n;i=i+1)&&&&& /* 循环控制:i从1开始到n(含n),每次步进1 */
&&&&& s=s+i;& &&&&&&&&&&& /* 循环体& :每次将i的值累加到s中&&&&&&& */
&& printf("%d\n",s);& &&&&&& /* 当离开循环的时候,i的值应&n&&&&&&&&&&&& */
&& return 0;&&&&&
for循环在C语言中的应用非常灵活,这里呈现的只是最基础的一种,透彻的理解它,明白循环执行的过程。
另外请注意i=i+1的写法,这不是一个不等式。=在这里是作为赋值号,在C语言里,“==”才是用来判断相等的运算符。i=i+1的含义就是把i的值加上1之后重新赋值给i,如果这句语句之前,i的值是2,那么执行这句语句之后i的值就增加1变成了3。这里的1也称为循环变量i的“步长”。
[入门032]数列求和二
内  容:
计算1+3+5+7+......+n之和
输入说明:
一个整数n,n肯定会是一个奇数。
输出说明:
输入样例:
输出样例:
简  析:
这次,我们来尝试一下while循环语句:
#include &stdio.h&&
int main()&
&& int f=1,s=0,n;& &&&&& /* 第一项的值(f)为1 */
&& scanf("%d",&n);&
&& while(f&=n)&&&&&&&&&& /* 循环控制:当f的值小于等于n,进行循环 & */
&& s=s+f;& &&&&&&&&&&& /* 循环体& :每次将i的值累加到s中&&& && */
&&&& f=f+2;&&&&&&&&&&&&&& /* f的值每次递增2,等差数列&& &&&&&&&&& */
printf("%d\n",s);& &&&&&& /* 当离开循环的时候,i的值应&n&&&&&&&&&&&& */
&& return 0;&&&&&
[入门033]数列求和三
内  容:
计算2+4+6+8+......+2n之和
输入说明:
一个整数n。
输出说明:
输入样例:
输出样例:
[入门034]数列求和四
内  容:
输入n,求1+1/2+1/3+...+1/n 的和,保留6位小数
输入说明:
一个整数n。
输出说明:
数列的和,保留六位小数。
输入样例:
输出样例:
简  析:
同上题,涉及小数计算,用double类型误差会小一些。
[入门035]数列求和五
内  容:
求1+4+7+10&+(3*n+1)的值
输入说明:
一个整数n,(1&=n&=2000)。
输出说明:
输入样例:
输出样例:
简  析:
数列题的解法一般是两种,其一是通过通项公式,其二是通过值的递推关系来求。对于本题,你可以利用题目中已经给出的通项公式,也可以自己归纳本序列的递推公式来得出每一项的值,并且累加出结果。
通项公式:&&&& f(n)=3*n+1
递推公式:&&&& f(n)=f(n-1)+3& && (n&=1,n&N*)
&&&&&&&&&&&&& f(0)=1
参考代码(利用通项公式)
1.& #include &stdio.h&&
2.& int main()&
4.& &&& int sum=0,n,fn,i;&
5.& &&& scanf("%d",&n);&
6.& &&& for(i=0;i&=n;i++)& & /* 变量i就是项号,注意数列首项 */
8.& &&&&&&& fn=i*3+1;&&&&&&&& /* 根据通项公式求f(i)的值& */
9.& &&&&&&& sum=sum+& &&&& /* 累加求和&&&&&&&&&&&&&& */
10. &&& }&
11. &&& printf("%d\n",sum);&
12. &&& return 0;&
参考代码(利用递推公式)
1.& #include &stdio.h&&
2.& int main()&
4.& &&& int sum=0,n,f=1,i;& /* 将f(0)的值赋值给f,作为递推的起点& */
5.& &&& scanf("%d",&n);&
6.& &&& for(i=0;i&=n;i++)&
8.& &&&&&& sum=sum+f;& &&&&&&&&& /* 将f(i)累加& */
9.& &&&&&& f=f+3;&&&&&&&&&&& /* 利用递推公式求f(i+1),即下一项的值 */
10. &&& }&
11. &&& printf("%d\n",sum);&
12. &&& return 0;&
[入门036]计算&
内  容:
计算&,可以用近似公式:
&/4 = 1-1/3+1/5-1/7+1/9-...+(-1)k&* 1/(2*k+1) 来计算
输入说明:
输入,一个整数k。k取值范围为0到1000(皆包含)。
输出说明:
输出&的值(保留4位小数)
输入样例:
输出样例:
简  析:
请寻找一种解决 + / - 交替的方法。
[入门037]计算阶乘n!
内  容:
n!=1*2*3*...*n
输入说明:
一个整数n (n&=12)
输出说明:
一行一个整数
输入样例:
输出样例:
简  析:
题目为什么会有n&=12的约定呢?拿出计算器,算算12的阶乘是多少?。13的阶乘呢?。从13!开始,结果就超过了long int的数据范围。如果要计算13的阶乘,怎么办呢?还好,C语言提供了long long int的数据类型。long long int数据类型占用8个字节、即64个二进制位。
令人比较纠结的是,在C语言中,对于这种数据类型的输入输出字符串并没有完全统一,windows下采用%I64d,linux下采用%lld,这个给我们带来了一些麻烦。所以建议对于long long int数据类型,采用C++语言的流输入输出会更方便一些。好在我们目前学到的C语言的代码都可以在C++中间执行,参考代码如下:
#include &iostream&&
int main()&
long long int ans=1;& &&&&& /* 定义一个long long int类型的变量 */
for(i=1;i&=n;i++)&
ans=ans*i;&
cout&&ans&&"\n";&
return 0;&
灰色底色部分是C++特有的语句部分,观察与C语言的区别。
另外,你在设计这段代码的过程中有没有考虑到数学上0!=1呢?
是否long long int一劳永逸了?NO!一方面,long long int的计算会比int慢,所以能用int处理的数据,就不要用long long int。另一方面,long long int能够保存的数值也是有限的。联系到本题,21的阶乘就会超过long long int的数据范围。接下来怎么办呢?我们不得不采用大数算法了(那是后话了)。
解决问题的时候,特别要注意数据范围,选择合适的数据类型!
[入门038]自然对数的底e
内  容:
e=1+1/1!+1/2!+1/3!+...+1/n!
这个公式会随着项数的不同计算出近似的e的值,我们现在的任务是输入最后一项的项号。如100,就加到1/100!,然后输出e的值(保留10位小数)
输入说明:
输入,一行一个整数n
输出说明:
输出,一行一个数,根据n求得的e值。(保留10位小数)
输入样例:
输出样例:
简  析:
10位小数&&,float数据类型已经达不到这个精度了,请用double。
听说你真打算计算出那个n! ? my god!
[入门039]从 n 个数中挑选出最大的数
内  容:
从 n 个数中挑选出最大的数
输入说明:
第一行一个数n,表示总的个数。第二行共n个数字,用空格隔开。
输出说明:
一行,最大数
输入样例:
输出样例:
简  析:
我们用循环结构来完成n个数的输入。
首先,读取n,确定循环的次数。
其次,读取n个数里面的第一个数,并且假设它最大,值存放在max变量中。
第三阶段,每次读一个数,把该数与目前最大的数max比较,如果新数比max更大,
     将新数赋值给max,成为新的最大值。第三阶段重复n-1次。
最后输出。参考代码如下:
#include &stdio.h&
int main()
& int i,n,a,
& scanf("%d",&n);
& scanf("%d",&max);
& for(i=2;i&=n;i++)
&&&&& scanf("%d",&a);
&&&&& if(a&max)max=a;
& printf("%d",max);
& return 0;
这种寻找最大值的方法,我们称为“擂台法”,会经常用到。
[入门040]负数之和
内  容:
输入一行若干个整数,有正有负,最后以0 结束,请输出其中负数的和
输入说明:
输出说明:
输入样例:
1 -1 2 3 -8 0
输出样例:
简  析:
“若干个”到底是几个,可能是100个,可能是10000个,可能是1000000个甚至更多,如果确定循环次数??请看参考代码:
1.& #include &stdio.h&&
2.& int main()&
4.& &&& int sum=0,n;&
5.& &&& for(;;)& & /* 没有循环判断条件的for循环,是一个无限循环& */
6.& &&& {&
7.& &&&&&&& scanf("%d",&n);&
8.& &&&&&&& if(n==0)& &&& /* 循环的出口,当n为0,break离开循环 */
9.& &&&&&&&&&&&&
10. &&&&&&& if(n&0)& &&&& /* 当n是负数,求和& */
11. &&&&&&&&&&& sum=sum+n;&
12. &&& }&&&&&
13. &&& printf("%d\n",sum);&
14. &&& return 0;&
C语言的for循环很强大是么?当然这个题目可以用do-while循环来写:
#include &stdio.h&&
int main()&
&&& int n,sum=0;&
&&&&&&& scanf("%d", &n);&
&&&&&&& if(n&0)&
&&&&&&&&&&& sum=sum+n;&
&&& }while(n!=0);& &&&&& /* 这个n!=0不是阶乘哦,“!=”是不等号 */
&&& printf("%d",sum);&
&&& return 0;&&&&&
你需要注意do-while循环与其他两种循环在程序流程上的差别。do-while循环是先执行循环体,再判断是否继续循环,循环体至少会被执行一次。这个与for循环和while循环是有差别的。本题中,至少会有一个数据被输入(0),所以用do-while循环比较方便。
[入门041]解不等式
内  容:
编程求下式子中最大n值
12+22+32+...+n2&&= x
输入说明:
输出说明:
输入样例:
输出样例:
简  析:
你设计出这个循环的出口了么?左面的累加过程我们是不是有些眼熟?当左面的和大于x,就不必再继续累加了,这个时候输出n-1就是正确的答案。(想想为什么是n-1?)
[入门042]各位数字之和
内  容:
求输入的一个整数的各位数字之和
输入说明:
输入一行一个非负整数n。(n&=2*10^9)
输出说明:
输入样例:
输出样例:
简  析:
我们曾经练习过输入一个固定位数的整数,然后分解出每个位上的数,现在这个整数的位数不确定,需要聪明的你去想办法解决了(提示:使用 % 和 / )。
与本题类似的还有对输入的整数是否是回文数的判断。
数组是内存中的一段连续空间,分配给一组相同类型的数组元素。整个数组共享一个数组名,并通过“下标”区分数组中的各个数组元素。
在“内存”城市中,有一条叫做“数组”的大街,大街上每一栋房子都是一样大小,门牌号码贴在大门的下方,所以叫做“下标”。^_^,而且每栋房子只能住一个人哦。
一个变量可以保存一个数值,一个数组可以保存一批相同类型的数值。我们经常用数组来对批量数据进行存储和加工。
[入门051]逆序输出
内  容:
按照顺序读入若干个数据,以逆序方式输出
输入说明:
第一行,一个数字n代表有n个整数需要被读入(n&=100)。第二行,n个整数。
输出说明:
一行,读入数据的逆序输出。
输入样例:
输出样例:
简  析:
读取输入的n个数对于我们已不是那么困难,但是如何把它们逆序输出呢?首先需要借助一些方法把输入的这些数据储存起来,定义100个变量?^_^,那不是个好方法,而且编程很难实施。我们可以使用“数组”这种数据结构来依次存放这些数。参考代码:
#include &stdio.h&&
int main()&
& int n,i;
int a[101];& && /* 定义数组a,该数组由编号0~100的101个数组元素组成*/
/* 每个元素可以用来存放一个整型数值,具有变量的特点 &*/
& scanf("%d",&n);&
& for(i=1;i&=n;i++)&
&&& scanf("%d",&a[i]);& /* 将第1~n个整数分别存入数组元素a[1]~a[n]&& */
& for(i=n;i&=1;i--)& &&& /* 由n到1的顺序依次显示a[i],完成逆序输出 */
&&& &&& printf("%d ",a[i]);
& return 0;&
请找出信息教材,阅读数组、数组下标、数组元素、数组元素的值的概念,并且参照上面的程序理解它们。C语言中数组下标的起始值是0,所以定义一个数组用来存放100个整数时,请增加一个元素:int a[101]。除非你比较习惯用0~99给这100个整数编号。
[入门052]移动元素
内  容:
将某数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。如下图所示:■&& □&& □ & □ & □ &&&& □ & □&&&& &&& & □&& □ & □ & □ &&&& □ & □ & ■&1&& 2&&&3&& 4&& 5&&&& n-1& n&&移动后&& &2&& 3&& 4&& 5&& & n-1& n& &1
数组元素个数不会超过100(元素类型为整型)
输入说明:
第一行n,表示会有n个元素。第二行n个整数
输出说明:
两行,第一行原数据。第二行移动后的数据
输入样例:
输出样例:
简  析:
1.输入,用数组储存原始数据
2.输出原始数据(第一行)
3.移动数组元素
& 我们可以用表达式:d[2]=d[3],把数组元素d[3]的值赋值给d[2]。
& 对于d[i]来说,d[i+1]是它右面一个数组元素,我们可以用d[i]=d[i+1]把后面一个元素的值移动上来。注意i的取值范围。
4.输出移动后的数据(第二行)
其实单纯对于本题,你也可以不作任何移动操作:输出第二行时先输出2~n个元素,然后再输出第一个元素,一样可以得到正确答案。
[入门053]斐波那契数列
内  容:
已知faibonacai(费波那契)数列的前几个数分别为1,1,2,3,5,8,13,&&,编程求此数列的前n(n&=5)项。
输入说明:
一行一个整数n(n&=5 and n&=22)
输出说明:
每5格一行,不足5个的也占一行
输入样例:
输出样例:
简  析:
对于斐波那契数列,可以用不同的算法来实现。这次我们利用数组来递推斐波那契数列。该数列的通项公式比较复杂,因此我们一般用递推公式来推这个数列。
&&&&&&&&&& fib(n)=fib(n-1)+fib(n-2)&&& (n&=3,n&N*)
&&&&&&&&&& fib(1)=&&& 1
&&&&&&&&&& fib(2)=1
算法实现是建立一个数组fib[],将斐波那契数组第一项的值放在fib[1]中,第二项的值赋给fib[2]。然后从3开始递推到n,每次赋值fib[i]=fib[i-1]+fib[i-2](就是将前面两个数组元素的和放入当前元素),非常清晰地体现了递推公式。参考代码如下:
#include &stdio.h&&
int main()&
&& int n,i,fib[23];& /* 因斐波数列第22项的值为17711,所以int足矣 */
&& scanf("%d",&n);
&& fib[1]=1;&&&&&&&& /* 第一项赋值 */
&& fib[2]=1;&
&& for(i=3;i&=n;i++)& && /* 初始化时同时将计数器清0 */
&&&&&& fib[i]=fib[i-1]+fib[i-2];&&& /* 递推斐波那契数列3~n项& */
&& /* 输出,自己动脑筋哦 */
&& return 0;&&&&&
好好练习,弄明白它,数组的确非常有用。
[入门054]打印某年某月有几天
内  容:
打印某年某月有几天
输入说明:
一行两个整数,前面是年份后面是月份
输出说明:
一个整数,该月的天数
输入样例:
输出样例:
简  析:
是不是考虑用一大堆if来判断每个月的天数?我们可以用数组优化:
我们定义一个数组,int md[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};用来存放每个月的天数(2月份用28天)。思考一下为什么第一个元素是0?对了,是因为C语言元素的编号从0开始。定义了这样一个数组以后,md[m]就可以得到m月的天数了,可以省略那么多冗长的分支判断语句。这种技巧非常实用。
别忘记闰年哦。
[入门055]成绩统计
内  容:
某班共有若干名学生(不大于40),已知他们考试的数学成绩,现需要统计100分、90~99分、80~89分、70~79分、60~69分与不及格各成绩档各有多少人。
输入说明:
第一行一个整数n,班级人数。以下 n行,每行一个整数,代表数学成绩。
输出说明:
共6行,从第一行依次为100分、90~99分、80~89分、70~79分、60~69分与不及格的人数。若没有此分数段人数输出0
输入样例:
输出样例:
简  析:
数据输入,对你来说已经没有问题。如果考虑使用数组将所有人成绩保存下来,因为n可能会等于40,所以数组定义的时候最好要定义到41个元素。其实本题数据不必保存。
统计如何完成?我猜想你会用很多if语句,也许会用switch语句?
这里,我们来看看另外一种统计的方法,参考代码如下:
#include &stdio.h&
int main()
& int count[11]={0},i,j,n,t;
& scanf("%d",&n);
& for(i=1;i&=n;i++)
&&& scanf("%d",&t);
&&& t=t/10;&&&&&&&& /* 百分制的成绩整除10以后会得到0~10的值 */
&&& count[t]++;&&&& /* 利用数组来进行统计,有点像统计选票 */
& printf("%d\n",count[10]);&
& printf("%d\n",count[9]);&
& printf("%d\n",count[8]);&
& printf("%d\n",count[7]);&
& printf("%d\n",count[6]);&
& t=count[5]+count[4]+count[3]+count[2]+count[1]+count[0] ;
printf("%d\n",t);&
& return 0;
本题统计的思路以后会推及基数排序和哈希表的应用。
[入门056]10进制转换
内  容:
将一个十进制正整数转化为二进制数
输入说明:
一行一个整数(10进制)
输出说明:
一行一个2进制数
输入样例:
输出样例:
简  析:
还记得怎样将十进制数转化为二进制数?“除2取余,逆序排列”。每一步取余得到的“0/1”数值利用一个数组储存起来,末了还要逆序输出。请看参考代码:
1.& #include &stdio.h&&
2.& int main()&
4.& &&& int m=1,i,n,b[40];&
5.& &&& scanf("%d",&n);&
6.& &&& while(n&0)&
7.& &&& {&
8.& &&&&&&& b[m]=n%2;& &&&&&&&&& /* 取余,余数存放在数组b下标为m的元素中 */
9.& &&&&&&& m++;& &&&&&&&&&&& /* m可以理解成为二进制数右起的位数&&& */
10. &&&&&&& n=n/2;& &&&&&&&&& /* n整除2,得到的商重新赋值给n,循环计算 */
11. &&& }&&&&&
12. &&& for(i=m-1;i&=1;i--)& /* 逆序输出 */
13. &&&&&&& printf("%d",b[i]);&
14. &&& printf("\n");&
15. &&& return 0;&&&&&
[入门057]圆盘找数
内  容:
圆盘上有20个格子,每个格子存了一个整数,找出4个相邻的数,使其相加之和最大。给出它们的起始位置以及4数之和。(顺时针转)
输入说明:
一行20个数
输出说明:
一行两个整数,第一个代表起始位置,第二个代表和。
输入样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
输出样例:
简  析:
想象一个圆环,等分为20个格子,顺时针用1-20进行编号。第20格之后便绕回到第1格。将圆环在20和1中间剪断,展开。这就是一个20个元素的数组。
算法实现的时候,要注意数据回绕,即第18个格子开始的4个元素是:18,19,20,1。
最简单的处理方法是将数组扩大一倍,把数组元素1-20中的值复制到21-40中,这是圆环问题经常采用的方法。
sum=p[i]+p[i+1]+p[i+2]+p[i+3]可以写作sum=sum-p[i-1]+[i+3]。
[入门058]奇数幻方
内  容:
把整数1到n2(n为奇数)排成一个n & n方阵,使方阵中的每一行、每一列以及对角线上的数之和都相同。这样的方阵(行列数相等的矩阵称为方阵)称为n阶奇数幻方。
研究发现,n阶奇数幻方可以按下列方法生成:
首先把数1填在第一行的正中间(a[1, (n+1)/2])。然后用一个循环依次填入数2到n2。一边填数以便找下一个数应该在的位置,填数按照下面的规律进行:
u如果数k填在第i行第j列的格子中(a[i,j]),那么一般情况下,下一个数k+1应填在它的左上方,即a[i-1,j-1]位置上;
u但是,如果左上方无格子(越界了,即i-1为0或j-1为0),那么就做如下处理:
&O若上方越界,即i-1为0,那么就填在该列的最下方a[n,j-1];
&O若左方越界,即j-1为0,那么就填在该列的最右方a[i-1,n]。
u如果找到的格子中已填过数了,那么数k+1改填在第k个数的正下方(a[i+1,j])。
输入说明:
一行一个奇数n。(不需要判错,且n&=11)
输出说明:
每行一n整数,共n行。每个数占4个宽度(用"%4d")。
输入样例:
输出样例:
15&& 8&& 1& 24& 17
&&16 &14& &7& &5 &23
&&22 &20 &13& &6& &4
&& 3 &21 &19 &12 &10
&& 9& &2 &25 &18 &11
简  析:
数据存储,你可以将二维数组想象成为excel中的一张表,将三维数组想象成为魔方这样的立体结构,四维数组?平行空间么?!^o^
定义一个初始值全为0的二维数组,为适应n=11,定义a[12][12]就够了。
然后?然后把题目的自然语言用C代码写出来就是了。注意,题目要求的是以首行中间为起点,左上斜排列的方式。你不能用其他排列方法,否则OJ会判你错误(即使你排列出来的同样也是n阶幻方)。参考代码如下:
#include &stdio.h&
int main()
&& int i,j,ti,tj,n,m,a[12][12]={0};
&& scanf("%d",&n);
&& i=1;&&&&&&&&&& /* 当前点的纵坐标 */
&& j=(n+1)/2;&&&& /* 当前点的横坐标 */
&& for(m=1;m&=n*n;m++)
&&&&&& a[i][j]=m;&&&&&&& /* 填入数字 */
&&&&&& ti=i-1;tj=j-1;&&& /* 下一个数字的临时横纵坐标 */
&&&&&& if(ti==0)ti=n;&&& /* 修正上方越界 */
&&&&&& if(tj==0)tj=n;&&& /* 修正左侧越界 */
&&&&&& if(a[ti][tj])&&&& /* 若该位已经有数值了 */
&&&& &&&&&&i++;
&&&&&& else
&&&&&&&&&& {i=j=}&& /* 用i,j确定下一个数字的位置*/
&& for(i=1;i&=n;i++)&&&& /* 输出 */
&&&& for(j=1;j&=n;j++)&&&&&& /* 不带{},for语句的循环体只有一句 */
&&&&&&&& printf("%d ",a[i][j]);
&&&& printf("\n");
&& return 0;
放下鼠标,回顾一下本章的题目,你会发现数组原来如此强大!从fibonacci数列、某年某月日期问题中较优的算法、到圆盘、矩阵的数据存储,都有数组在背后默默工作着。数组的作用还远不止于此,它本身不是算法,它只是程序设计中经常被用到的一种数据存储,一种强大的数据存储。去掌握好这个强大的工具,你也会变得强大。
字符、字符串
本章主要熟悉字符型数据的应用,首先整理一下C语言中有关字符型的知识点:
字符型常量:
&&& 字符型常量是用一对单引号(')扩起来的单个字符。如'a'~'z', '0'~'9'等。
&&& 转义字符型常量,'\n'(换行), '\''(单引号),'\”'(双引号)等。
字符型变量:
&&& 字符型变量是一个单字节整数的基本数据类型。当它用来存放一个字符的时候,实际储存在这个字节中的是一个整型值,即该字符的编码,一般来说就是该字符的ASCII码。
字符型变量的定义:
char k,t; &&& /*& 定义字符型变量k和t */
字符型变量的赋值:
我们可以将一个字符通过常量、变量、ASCII码值及相关表达式赋值给一个字符型变量。
&&& k='b';&&&& /* 通过字符型常量方式赋值& */
&&& t=k;&&&&&& /* 通过字符型变量方式赋值& */
&&& t=98;&&&&& /* 通过ASCII码值方式赋值& */
&&& t='a'+1&&&&&& /* 通过表达式计算后赋值&&& */
字符型数据的运算:
&&& 常见的字符型数据的运算有数值运算、关系运算(下例中k为字符变量,a为整型变量)
&&&&&& k='b'+4&&& &&& /* 将'b'之后第4个字符('f')赋值给k&&& */
&&&&&& a=k-'a'&&&&&& /* 计算字符型变量k所表示字符与'a'的距离&& */
&&&&&& k&='a' && k&='z'&&&& /* 判断k所表示字符是小写英文字母& */
&&&&&&&&&&&&&&&&&&&&&&&&&&& /* 注意,大小写英文字母是不同的&&&& */
字符型数据的输入:
&&& scanf("%c",&k)&&& /* scanf()标准输入函数,格式字符串使用%c,c表示char */
&&& t=getchar()&& /* 从stdio流读一个字符,赋值给t,需要stdio.h头文件 */
字符型数据的输出:
&&& 使用标准输出函数printf()的不同格式字符串,可以输出某字符,或它的ASCII码:
&&&&&& k='b';
&&&&&& printf("%c",k);&&&&& /* 屏幕输出得到b这个字符& */
&&&&&& printf("%d",k);&&&&& /* 屏幕输出得到98(即字母b的ASCII码)*/
&&&&&& printf("%d",'b');&&& /* 同上 */
&&& 与getchar()函数对应,有putchar()函数也可用于字符的输出。
[入门061]统计字符
内  容:
输入若干个字符(以'#'作为结束),计算输入的字符中字母'a'或'A'出现的次数。
输入说明:
一行若干个字符。
输出说明:
一个整数,为a或者A字符出现次数和。
输入样例:
abcdefABCDEFaaAA#
输出样例:
简  析:
&&& 字符读取练习。利用scanf()或者getchar()不断地去读一个字符,直到读到的字符为'#',即程序结束。你可以仿效[入门040]里面读取数值的循环结构。本题参考代码:
#include &stdio.h&&
int main()&
&&& int count=0;&
&&&&&&& scanf("%c",&t);& && &&& /* 读取一个字符,存入t中 */
&&&&&&& if(t=='a' || t=='A')& /* ||是或运算,&&是与运算 */
&&&&&&&&&&& count++;& &&&&&&&&& /* 或运算,两者满足其一即可 */
& & }while(t!='#');&
& & printf("%d\n",count);&
& & return 0;&
本题还可以用for循环,while循环完成。
[入门062]字符分类统计
内  容:
从键盘输入一系列字符,编程分别统计出其中的数字字符、字母字符和其它字符的个数,输入问号(?)时表示程序结束(问号本身不要统计在内)。
输入说明:
一行,字符串,以?结束
输出说明:
三行,每行一个整数,依次代表字母,数字,其它
输入样例:
输出样例:
简  析:
沿用上题思路就可以顺利解决本题。注意三种字符分类方法(可以去看下ASCII码表)。
[入门063]删除空格
内  容:
读入一行字符,然后输出所有非空格字符,相对顺序不变,另外输出非空格字符个数。
输入说明:
输出说明:
两行,第一行是非空格字符,第二行一个整数,非空格字符的个数。
输入样例:
asdfj12 jk
输出样例:
简  析:
首先,这个“一行字符”是以行末标识符为终点的。当你连续输出超过80个字符,造成屏幕上的输出折转到下一行,这并不是本题中“一行”的概念。“读入一行字符”字符数量可以超过80个,直至行末标识符或文末标识符为止。那么到底哪个是行末标识符呢?我们之前已经使用过它&&'\n'。
其实windows下的行末标识符是"\r\n",linux下只是"\n"。参考代码:
#include &stdio.h&
int main()
& int cnt=0;
& scanf("%c",&t);
& while(t!='\n'&&t!='\r')&&&&&& /* 非行末字符 */
&&&&& if(t!=' ')&&&&&&&&&&&& /* 非空格字符 */
&&&&&&& cnt++;&&&&&&&&&&&&&& /* 计数 */
&&&&&&& printf("%c",t);&&&&& /* 输出 */
&&&&& scanf("%c",&t);&&&&&&& /* 读下一个字符 */
& printf("\n%d\n",cnt);
& return 0;&&
[入门064]加密
内  容:
将字母a-&f,b-&g,所有字母均后移5个字母,如,z-&e,给出一行小写字母,请将加密后的密文输出。其他字符不改变。
输入说明:
一行小写字符
输出说明:
一行小写字符
输入样例:
i love you
输出样例:
n qtaj dtz
简  析:
字符的计算加工。本章开始的知识点整理中有例子介绍如何将a-&f,请折回去仔细看一下。略难的是z-&e的处理。参考代码通过取余来解决:
[入门065]字母替换
内  容:
一行字符,若是小写字母,则将a,b,c...y,z, 替换 z,y...c,b,a,若不是小写字母则不变。
输入说明:
输出说明:
输入样例:
输出样例:
简  析:
本题不解释,自由发挥,独立完成。
[入门066]括号配对
内  容:
读入一个算术表达式,检查其中的圆括号是否配对,给出适当信息(正好,Yes,左括号多,Left,右括号多,Right)
输入说明:
输出说明:
三个信息之一
输入样例:
3*(4-5)+9/2
输出样例:
简  析:
其实这题有点“水”,只需要判断行末时左右括号的数量。并没有要求识别“2*)3+2(”这样的错误。你是否可以写出更严格一些的判断程序呢?
[入门068]图形示数
内  容:
给出三个整数(&=80),用指定字符的图形表示三数的大小!如:
表示三个数的大小
输入说明:
第一行三个整数
第二行一个字符
输出说明:
输出三行图示
输入样例:
输出样例:
简  析:
本题只提供输入部分的参考代码。
你失败了多少次?知道原因么?你的代码也许是这个样子的:
&& int a,b,c;
&& scanf("%d%d%d",&a,&b,&c);&
&& scanf("%c",&p);
在看不到输出结果的时候,可以输出一下程序读到的字符(p)的ASCII码值,然后进行分析。这是一个scanf()陷阱的问题。scanf()函数在处理你输入的信息时,将空格、TAB、回车符看作是一个输入的结束。“一个输入”指的是一个”%d”或者一个”%s”这样的定义。scanf()在处理完这一个输入后,会将空格、TAB或回车符遗留在stdio流中。当你在用scanf()读取整数、浮点数、字符串这些类型数据后,再用scanf("%c",&p)或者getchar()去读一个字符的话,你读到的将会是那个空格、TAB或回车符。
解决方法一:想办法把这个多余的字符去除。
可以通过增加一次scanf("%c",&p)或getchar()把这个字符去掉,为了应对多个空格或者回车的情况,可以写成如下的方式,去理解下面这个语句,不要只是抄写。
while((p=getchar())=='\n'||p==' ');
输入部分参考代码:
&& int i,a,b,c;
&& scanf("%d%d%d",&a,&b,&c);
&& while((p=getchar())=='\n'||p==' '); /* 遇到空格和回车反复读字符*/
解决方法二:整行读入,手工处理。
可以采用前面题目接触过输入“一行”的方式,逐一字符读入,手工处理其中的整数数值和字符。也可以采用后文将要提到的字符串的读入方法,将整行读入一个字符数组,也是逐一字符处理。(字符/字符串方式读取整数)
“整行读入,手工处理”是一个信息竞赛中常用的技巧。
输入部分参考代码:
&& int i,a=0,b=0,c=0,p;
&& while((p=getchar())=='\n'||p==' '); /* 去除第一行头上多余空格& */
&& while(p&='0'&&p&='9')&&&&&&&&&&&&&& /* 手工方式处理a的值&&&&& */
&&&&&& a=a*10+p-'0';
&&&&&& p=getchar();
&& while((p=getchar())=='\n'||p==' ');
&& while(p&='0'&&p&='9')
&&&&&& b=b*10+p-'0';
&&&&&& p=getchar();
&& while((p=getchar())=='\n'||p==' ');
&& while(p&='0'&&p&='9')
&&&&&& c=c*10+p-'0';
&&&&&& p=getchar();
&& while(p!='\n')&&&&&&&&&&&&&&&&&&&&& /* 换行 */
&&&&&& p=getchar();
&& while((p=getchar())=='\n'||p==' '); /* 读第一个非空格字符& */
经过手工处理,你才会发现,原来scanf()帮助我们做了那么多工作。
在你熟悉后面字符串操作之后,还可以用sscanf()的方法从字符串中进行输入。
解决方法三:用字符串读入,取串首字符。
等学过字符串输入之后,你会明白。
解决方法四:使用不会遗留回车、空格的方法读取数据。
在C++中,我们使用iostream的cin方式读取数据,可以避免残留空格、回车的问题。
输入部分参考代码:
&& int i,a,b,c;
&& cin&&a&&b&&c&&g;& &&&&&&& /* 多简洁明了! */
[入门069]进制转换
内  容:
将一个四位的十六进制数转换为十进制数
输入说明:
一行,一个16进制数字(字母的大小写不限制,如F、f 带代表15)
输出说明:
一行一个十进制数
输入样例:
输出样例:
简  析:
我相信你可以轻松过本题。注意位权问题,以及对'a'~'f'和'A'~'F'的分别处理。
[入门071]统计单词
内  容:
输入一行字符,包含若干个单词。约定相邻的两个单词用若干个空格隔开,编程统计其中单词的个数。
输入说明:
一行x个单词,由y个空格隔开(以句号结束)
输出说明:
一行一个整数,单词个数x。
输入样例:
i love you.
输出样例:
简  析:
可以使用与上题读取数值类似的技巧:
#include &stdio.h&
int main()
& int cnt=0,t,ws=0;
& while((t=getchar())!='.')&&&
&&& if(t&='a'&&t&='z'||t&='A'&&t&='Z')
&&&&& if(ws==0)
&&&&&&& {cnt++;ws=1;}&&&& /* 新的单词开始,ws表示一个单词读取中 */
&&& if(t==' ')ws=0;&&& && /* 以空格作为一个单词的结束 */
& printf("%d\n",cnt);
& return 0;
你也可以利用字符串的输入,将代码简化为这样:
#include &stdio.h&&
int main()&
&& char t[1000];&
&& int count=0;&
&& while(scanf("%s",t)&0)& & /* 每次读取一个字符串,读取时以空格分隔 */
&&&& count++;&
&& printf("%d\n",count) ;&
&& return 0;&
字符串常量:
字符串是由n个字符组成的序列,n称为字符串的长度,当n=0时称为空串。C语言中,字符串常量两边要加上双引号。"abc", "a", "3.5","Shang Hai"等都属于字符串常量。空格、单引号都是合法的字符串的成员。斜杠(\)、双引号、回车符等作为字符串的成员时需要使用转义符。
字符串的存储
C语言中不存在字符串数据类型。使用字符数组存放字符串。
&&& char str1[10];
C++中有了string的类(class),但本质上也是使用的字符数组。
&&& string str2;
系统自带的函数操作字符串时,都是从字符数组下标为0的单元开始的。如用scanf()读取字符串,放入str1[]数组,第一个字符会放在str1[0]的单元里。
字符串的结束标志:
C语言中规定字符串以字符'\0'(ASCII码值0)作为结束标志,这个标志会由系统自行加在字符串的末尾。所以字符串"a"在内存中实际占用两个字符的空间:字符'a'和标志标志'\0',这是'a'(字符)与"a"(字符串)的区别。
因为包含结束字符'\0',所以要存放10个字符的字符串时,必须要定义11个元素的字符数组,最后一个位置用来存放'\0'。
系统自带函数以字符串方式处理字符数组时,当遇到'\0'便认为该字符串结束。
字符串的最基本操作(C语言):
定义字符数组:&
char str1[6]={'W','o','r','l','d','\0'};&&&&& /* 逐个字符定义 */
char str2[6]="World";&&&&&&&&&&&&& /* 用字符串常量初始化字符数组 */
char str3[]="World";&&&&&&&&&&& /* 让计算机自己计算数组大小 &&*/
char str4[100];&&&&&&&&&&&&&&&& /* 只定义字符数组,不置初始值 */
字符串的输入:
&&& scanf("%s",str2);&&&&&&&&&&&&&& /* 使用的格式字符串为%s && */
&&& gets(str2);&&&&&&&&&&&&&&&&&&&& /* 输入一个字符串,并存入str2 */
&&& gets()接收字符串输入直至回车('\n')为止,可以用来接收含空格的字符串。
字符串的输出:
&&& printf("%s",str2);&&&&&&
&&& puts(str2);&&&&&&&&&&&&&&&&&&&& /* puts()会自动回车换行 & */
&&& 以'\0'作为字符串结束标志,如果手工在字符串中间增加'\0',会截断之后部分。
C语言中对于字符串的赋值、比较等操作一般都调用string.h内的相关函数。C语言中字符串的赋值,不能用=号来完成。
&&& strcpy(str4,"Hello");&&&&&&&&&& /* 字符串赋值& */
&&& strcmp(str3,str4);&&&&&&&&&&&&& /* 字符串比较& */
&&& strlen(str4);&&&&&&&&&&&&&& /* 返回str4所含字符数 */
字符串的最基本操作(C++):
C++在C语言字符数组的基础上封装了string的类(class),增加了很多方便的操作。使用string类,需要#include &string&。注意这里是string,而不是string.h, string是C++的头文件,而string.h是C语言的头文件。如果要在C++里用C语言的string.h,应该写作:#include &cstring&
定义字符串变量:
&&& string str1;&&&&&&&& & /* 定义一个字符串变量str1 */
&&& string str2("Hello");&&& & /* 定义str2,并将"Hello"作为初始值 */
C++字符串的输入:
&&& cin&&str1;&&&&&&&&&& & /* 既然是C++,用cin会方便点,遇空格会中断 */
&&& getline(cin,str1);&&&&&& & /* 可以输入带空格的字符串,需头文件string */
&&& char str3[200];&&&&& & /* 字符串数组 */
&&& cin.getline(str3,100)&&& & /* str2应该是字符数组,而非string &&&& */
&&&&&&&&&&&&&&&&&&&&&&&& & /* 100表示读取字符的最大长度,满100会截断 */
C++字符串的输出:
&&& cout&&str1;&&&&&&&&& & /* C++ 流方式输出字符串 */
C++字符串的赋值:
&&& string类重载了赋值运算符=,可以使用=对string类型进行赋值。
&&& str1 = str2;&&&&&&&& & /* 用string类型给string类型进行赋值 */
&&& str1 = str3;&&&&&&&& & /* 用字符串数组给string类型赋值 */
&&& str1 = "World";&&&&& & /* 用字符串常量给string类型赋值 */
C++字符串的比较等操作:
string类重载了==,&,&,&=,&=,!=等运算符,可以直接用于string之间的比较。还可以使用compare()函数进行字符串、和字符数组之间的相互比较,参见相关资料。C++中还为string类定义了很多丰富的函数,也参见相关资料。
[入门072]Hello World!
内  容:
一般学语言,第一个程序会是Hello World。
为什么我们放在那么后面才做呢?
输入一个名字,显示 Hello &名字&!
输入说明:
输入一行,一个名字,如human(字符串类型)
输出说明:
一行,输出 Hello human!(注意行尾的感叹号,且!前面没有空格)。
输入样例:
输出样例:
Hello kitty!
简  析:
参考代码如下:
#include &stdio.h&&
int main()&
&& char a[100];& &&&& &&&&&& /* 定义字符数组 */
&& scanf("%s",a);& && &&&&&& /* 输入字符串,注意数组名a前不用加&&& */
&& printf("Hello %s!",a);& & /* 输出字符串 */
&& return 0;&&&&
用scanf()输入的字符串会从字符数组第一个元素a[0]开始存放,并且在字符串最后一个字符后多占用一个数组元素,以存放字符串结束标识符'\0'。
[入门073]明天星期几
内  容:
输入今天是星期几的序号(星期天的序号为0),输出明天是星期几的英文单词。
Sun,Mon,Tue,Wed,Thu,Fri,Sat
输入说明:
一个整数(0-6)
输出说明:
输入样例:
输出样例:
简  析:
我们用一维的字符数组可以保存一个字符串。通过定义二维字符数组,可以方便地保存多个字符串。二维数组可以看作为一维数组的数组。
#include &stdio.h&
int main()
& char w[7][4]={'S','u','n','\0',&& && /* w[0][0]是'S',w[0][1]是'u' && */
&&&&&&&&&&&&&&& 'M','o','n','\0',&&& /* w[1][0]是'M',w[1][1]是'o' */
&&&&&&&&&&&&&&& 'T','u','e','\0', &&&&&& /* 依此类推,注意第四个字符'\0'&&& */
&&&&&&&&&&&&&&& 'W','e','d','\0',
&&&&&&&&&&&&&&& 'T','h','u','\0',
&&&&&&&&&&&&&&& 'F','r','i','\0',
&&&&&&&&&&&&&&& 'S','a','t','\0'
&&&&&&&&&&&&&&& };
& scanf("%d",&n);
& printf("%s",w[(n+1)%7]);&&&&&&&& /* 用字符串方式输出一维数组 */
& return 0;
也可以把字符数组的定义简化成为这样:
char w[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
请在此注意字符串输出语句。另外请思考(n+1)%7的意思。
[入门074]字符串大小
内  容:
输入两串字母,并按字典顺序将其输出。
输入说明:
两行,以#结束的字符串。#只作为字串结束标志,不参加字串大小的比较。
输出说明:
两行,排好顺序的字符串
输入样例:
输出样例:
3212#(上面的串小)
简  析:
定义字符数组,分别输入两个字符串,然后从头(数组下标0)开始,逐字符比较。建议初学字符串的同学,要使用逐字符比较的方法完成本题。不要用compare()这类现成的函数,除非你把字符串尾部的#去掉。
参考代码逐字符比较版:
1.& #include &stdio.h&&
2.& int main()&
4.& && char a[1000],b[1000],i;&&&&&
5.& && gets(a);&
6.& && gets(b);&
7.& && i=0;& &&&&& /* 从下标为0的字符开始比较 */
8.& && while(a[i]==b[i] && a[i]!='#' && b[i]!='#')i++;&
9.& &&&& && /* 若a、b两数组中对应位置的字符相同,转而进行下一个字符的比较 */
10. && if(a[i]&b[i] && b[i]!='#')&
11. &&&&&& printf("%s\n%s\n",a,b);&
12. && else&
13. &&&&&& printf("%s\n%s\n",b,a);&
15. && return 0;&
[入门075]隐藏的最大整数
内  容:
今天是个好日子,整数小伙伴们又一起出来聚会了。大家商议决定:今天玩捉迷藏!
玩法很简单,就是找出藏在一个长长的字符串中的整数小伙伴。(任何两个整数小伙伴都不会并排藏在一起)。而且,因为伙伴们太多,只找到此次藏起来的最大的那个小伙伴就可以了。并且,大家一致同意,让“0”做第一个找人的人&&当然,事先,他并不知道到底有哪些伙伴藏起来了&&
游戏开始了。“0”是一个很聪明的人,很快,他就把最大的那个伙伴找出来了。
如果你是“0”,你能写个程序来解决这件事情么?
输入说明:
只有一个字符串,这里面藏有很多的整数小伙伴。
输出说明:
只有一个整数,表示藏在其中的最大的那个整数小伙伴的起始位置(整数第一个数字在原串中的位置)。
已知,所有的小伙伴都不会超过。
输入样例:
*((*-a32AB342+//32143abAA
输出样例:
简  析:
这个串中共藏有32、342和32143三个小伙伴,其中32143是最大的,它在原来的串中的位置是17。
作好思想准备,字符串可能超过80个字符,其中还可能包含空格。
提供的参考代码可以通过OJ的测试,但是只考虑了正整数,你是否能够写一个程序把负整数一起处理了呢?读懂它,修改它!
1.& #include &stdio.h&&&&
2.& main()&&&
4.& & char s[10000];&&&
5.& & long i,sum=0,max=-1,p,maxp,isnum=0;&&&
6.& & gets(s);&&&
7.& & i=0;&&
8.& & while(1)&&& &&& /* 想一想,这里为什么不写while(s[i]!= '\0') */
9.& &&& if(s[i]&='0' && s[i]&='9')&&&
10. &&& {&&&
11. &&&&&&& if(isnum==0)& &&&&&& /* isnum=0,该字符前读的不是整数 */
12. &&&&&&&&& {p=i;isnum=1;}&&& & /* isnum=1,标记正在读的是一个整数 */
13. &&&&&&& sum=sum*10+s[i]-'0';&
14. &&&&&&& i++;&
15. &&& }&&&&
16. &&& else&&& &&&&&&&&& /* 当前字符不是数字,可能是一个整数的结束 */
17. &&& {&
18. &&&&&&& if(sum&max)&&&
19. &&&&&&& {&&&
20. &&&&&&&&&&& max=&&&
21. &&&&&&&&&&& maxp=p;&&&
22. &&&&&&& }&&&
23. &&&&&&& sum=0;& &&&&&
24. &&&&&&& isnum=0;& &&& /* 更改状态,现在读的不是数值 */
25. &&&&&&& if(s[i]=='\0')& && /* 字符串处理完,走人! */
26. &&&&&&& i++;&
27. &&& }&&&
29. & printf("%d",maxp+1);&&&&& /* 我们从1开始数,而C语言从0开始放数组 */
30. & return 0;&
本章小结:
终于,本章写完了。花了足足三个星期。
不得不说,字符、字符串以及它们在输入输出过程中,我们会遇到不少麻烦,甚至是陷阱。而这些又是我们不得不掌握的。建议你再次把本章的文字内容仔细阅读一遍,结合你的实验过程,细细体会。
其实说简单点,本章会有一些常见的难点:
l字符数组的操作
l混合输入中单个字符的处理([入门068]图形示数)
l字符串输入过程中的空格、回车问题、超长字串问题
复杂的循环结构
本章首先通过绘制各种平面几何图形,进一步熟悉循环结构。
在[入门068]图形示数中,已经接触到利用循环语句来绘制连续的符号。例如我们输出连续的m个'*'号,就可以使用以下语句:
&&& for(i=1;i&=m;i++)
&&&&&&& printf("*");
在上述代码外再套上一层n次的循环,就可以绘制n*m的矩阵了:
for(j=1;j&=n;j++)&&&&&&& /* n行 */
{&&&&&&&&&&&&&&&&&&&&&&& /* 循环体,每次输出一行m个'*'号 & */
&&& for(i=1;i&=m;i++)&&& /* 注意内外层的循环变量不应该相同&& */
&&&&&&& printf("*");
&&& printf("\n");&&&&&&& /* 输出完m个'*'号以后别忘记回车符 */
将上述代码,内层循环for语句中的i&=m改为i&=j,使得每行的星星数量等于行号j,就可以得到一个n行n列的直角三角形(图二)。
for语句中的循环变量也可以是递减的。在上例三角形的基础上,将外层循环的for语句修改为for(j=n;j&=1;j--),我们就可以得到一个上大下小的三角形了(图四)。
至于梯形、平行四边形、菱形等,都是由这两点演变而成。梯形是在三角形基础上,每行都增加了若干个星号;平行四边形则是在矩形的每一行前面增加了一些空格占位,而且这些空格构成了一个比较小的三角形;至于菱形,你可以把它看成上下两个三角形的叠加,也可以看成是一个切掉四角的矩形(如何切角?思考!思考!)
建议在做本章题目之前,先用C语言练习绘制以下图形:
            
            
[入门081]星星飞满天&矩形
内  容:
编写程序,用*号画一个n行m列的矩形。
输入说明:
一行两个整数n,m。(1&=n,m&=40)
输出说明:
n行m列用*绘制的矩形。
输入样例:
输出样例:
[入门082]平行四边形
内  容:
输入n,打印一个平行四边形。
输入说明:
输出说明:
一个n行,每行n个'*'的平行四边形。注意:最后一行前面没有空格。
输入样例:
输出样例:
&&& *****&& *****& *****&**********
[入门083]#号倒三角形
内  容:
三角形如下图:
&###########&&#########& &#######&& &#####&&& &###&&&& &#
输入说明:
输入n,代表行数
输出说明:
n行的三角形,首行左边无空格。
输入样例:
输出样例:
#############
&###########
&#########
[入门085]数字三角形
内  容:
输入行数n,输出数字三角形。如下图,是输入3时得到的图形。
输入说明:
一行一个整数(1&=n&=10)
输出说明:
数字三角形,每个数字占3个宽度("%3d")
输入样例:
输出样例:
简  析:
输出的内容不再是一个固定的符号,而是一个不断在递增的值。
[入门086]蛇形数字三角
内  容:
输入行数,如3输出如下图形42 51 3 6
输入说明:
一个整数n,表示行数。(1&=n&=10)
输出说明:
蛇形排列的数字三角形,每个数占3个宽度。
输入样例:
输出样例:
简  析:
正常方法输出,你不得不先输出第一行,然后是第二行&&,要寻找4-2-5-1-3-6这样的规律会比较困难。让我们来看看这个“蛇形”是怎么样排列的:本题是一个倒斜的数字三角形,当输入3的时候,我们用三轮填数完成。第一轮,第n行第1列(左下角),填充1个数字1;第二轮,从第n-1行第1列开始,向右下斜,填写2个数值,2,3;第三轮;n-2行1列开始,斜向右下,依次填写3个数值4,5,6。(见下图示意)
我们的解题思路是:像幻方题一样,建立一个数组,在数组里面完成蛇形填数,最后输出。说到幻方题,你应该去看一下那个题目,对本题很有参考价值。
#include &stdio.h&
int main()
&&& int a[12][12],i,j,c=1,n;
&&& scanf("%d",&n);
&&& for(i=n;i&=1;i--)&&&&&&&&&& /* 填数 */
for(j=1;j&=i;j++,k++)
&&&&&&& a[k][j]=c++;
for(i=1;i&=n;i++)&&&&&&&&&& /* 输出 */
&&&&& for(j=1;j&=i;j++)
&&&&&&& printf("%3d",a[i][j]);
&&&&& printf("\n");
&&& return 0;
[入门087]杨辉三角
内  容:
11 11 2 11 3 3 11 4 6 4 1&&
输入说明:
输入一个整数n,n表示行数(1&=n&=10)
输出说明:
n行的杨辉三角形,每个数字占3个宽度。
输入样例:
输出样例:
简  析:
杨辉三角型又称为帕斯卡三角形,是算法的经典题目。这里在二维数组中使用递推的方法来解本题。我们把杨辉三角型之外的部分全部看成0,就可以发现除了最顶上的那个数字,其余每个位置的值都是他左上方和正上方两数的和。我们就是使用这个方法递推:
&& yh[1][1]=1;&&&&&&&&&&&&&&&&& /* 第一个数值是1 */
&& for(i=2;i&=n;i++)&&&&&&&&&&& /* 第二行开始递推,外层表示行 &&&& */
&&&& for(j=1;j&=i;j++)&&&&&&&&&&&&& /* 每个值都是它左上、正上两数的和& */
&&&&&&& yh[i][j]=yh[i-1][j-1]+yh[i-1][j];&
本章小结:
希望通过本章的练习,能够让你对循环结构有了更深入的理解。当你写下一个循环结构,就应该在自己的脑海里,对这个循环执行过程中各变量的变化情况,及循环中止时各变量的值有正确的预判。如果还没有能够做到这一点,至少也要努力去预估,然后通过实践来检验。
一九八四还是八五年的一个周六下午,在小学校园中,我第一次见到了电子计算机,并且有幸得到了一段计算机打印的纸带&&我出生那个月的日历。这个纸片我珍藏了很久,也许就是这个燃起了我对计算机的兴趣。我也写过很多的日历程序,各种语言、各种样式、各种功能&&大家也来挑战一下本章的最后一题吧!(谁说“本章小结”一定要写在最后?)
[入门088]月历
内  容:
输入年份和月份,输出该月的月历。
提示:由于公元日历的编排,每400年是一个大周期,在400年中设置有97个闰年,于是2001年与公元1年的1月1日都是星期一。对于输入的年号y,y年的1月1日是星期w,其中w = s mod 7 的余数,0 代表周日,那么s的值如何计算呢?
&&&&&&& s=y-1+[(y-1)/4]-[(y-1)/100]+[(y-1)/400]+1
为什么是400年一个大周期?
365*400=146000天
根据闰年的规则,400年会有97个闰年,加上97天:
146000 + 97 = 146097天
146097 % 7 = 0, 146097 / 7 = 20871周
146097天正好是20871个星期,一天不多,一天不少。加上闰年的周期规定,所以400年正好是一个周期。
输入说明:
一行两个整数,代表年份和月份(不需要判错)
输出说明:
第一行,星期的标志,每个占4位
若干行,每个整数占4位字符空间。
输入样例:
输出样例:
简  析:
确定好该年份的一月一日是星期w,然后计算出m月的1日是星期几(注意闰年问题),接下来就是输出了。
枚举是使用计算机解题常用的一种方法。枚举者,一一列举也。我们利用计算机运算高速、不知疲倦的特点,将所有可能的解一一列举,并对列举出的数据逐一进行检验,最终找到符合题目要求的答案。
[入门091]求满足条件的整数个数
内  容:
在1-n中,找出能同时满足用3除余2,用5除余3,用7除余2的所有整数的个数,如果没有请输出0。&
输入说明:
输入一行,只有一个整数n(1&=n&=2000)
输出说明:
输出只有一行(这意味着末尾有一个回车符号),包括1个整数。
输入样例:
输出样例:
简  析:
哪些是所有可能的解?[1, n]的整数。怎样去将这些数值逐一产生?用循环即可。
怎样检验?用if来判断。判断条件呢?“满足用3除余2&&”参考代码如下:
#include &stdio.h&
int main()
&&& int n,i,cnt=0;
&&& scanf("%d",&n);&&&
&&& for(i=1;i&=n;i++)&&&&&&&&&&&&&& &&& /*& 一一列举&&& */
&&&&&& if(i%3==2 && i%5==3 && i%7==2)&&&&& /*& 逐一检验&&& */
&&&&&&&&& cnt++;&&&&&&&&&&&&&&&&&&& &&& /*& 符合条件,进行处理& */
&&& printf("%d\n",cnt);&&&
&&& return 0;
[入门092]鸡兔同笼
内  容:
鸡兔同笼中头的总数,脚的总数,求鸡兔各多少只
输入说明:
一行两个整数分别表示头、脚总数(保证有解,当然有可能解为0)
输出说明:
一行两个整数,分别表示鸡、兔的只数
输入样例:
输出样例:
简  析:
“鸡兔同笼”是怎样一个题目?《孙子算经》中记载“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。问笼中各有几只鸡和兔?
这里我们可以使用枚举法去解这类题目:我们一一列举鸡可能的数量(0&=c&=35),通过鸡的数量可以得到兔的数量(r=35-c,一共35个头),这样就产生了一个可能的答案。继而对这个答案进行检验,检验的标准就是另外一个条件&&共94只脚。
#include &stdio.h&
int main()
&& int c,r;
&& for(c=0;c&=35;c++)
&&&&& r=35-c;
&&&&& if(c*2+r*4==94)
&&&&&&&& printf("%d %d\n",c,r);
&& return 0;
上面所列的是标准版的鸡兔问题的代码,在理解这一代码的基础上修改完成本题。
通过两题的练习,你是否可以总结出:枚举法往往是通过循环结构来一一列举所有可能的解,并在循环体中使用if判断来逐一检验该(组)数据是否符合题目的要求?嗯,大体上就是这样。
[入门093]水仙花数
内  容:
求100-999中的水仙花数,(若三位数abc,abc=a3+b3+c3,则称abc为水仙花数。如153,13+53+33 = 1+125+27 = 153,则153是水仙花数)
输入说明:
输出说明:
每行一个整数
简  析:
根据题目,所有可能的解的范围是多少?100~999。
怎样判断某个三位数是否是水仙花数?将这个数的百位数、十位数和个位数分离出来,用题目给出的公式进行判断即可。
#include &stdio.h&
int main()
&& int i,a,b,c;
&& for(i=100;i&=999;i++)
&&&&& a=i/100;&&&&&&&&&& /* 百位 */
&&&&& b=(i/10)%10;&&&&&& /* 十位 */
&&&&& c=i%10;&&&&&&&&&&& /* 个位 */
&&&&& if(a*a*a+b*b*b+c*c*c==i)
&&&&&&&& printf("%d\n",i);
&& return 0;
这个题目还有另外一个思路,就是将百位数a,十位数b,个位数c分别枚举:
#include &stdio.h&
int main()
& int a,b,c;
& for(a=1;a&=9;a++)&&&&&&&&&&&& /* 百位数的取值范围是1~9 */
&&& for(b=0;b&=9;b++)&&&&&&&&&& /* 十位数的取值范围是0~9 */
&&&&& for(c=0;c&=9;c++)
&&&&&&& if(a*a*a+b*b*b+c*c*c==a*100+b*10+c)&&&
&&&&&&&&& printf("%d%d%d\n",a,b,c);
& return 0;
[入门094]四位整数
内  容:
编程找出四位整数 abcd 中满足下述关系的数:&&&&&&&&&&&&&&&& ( ab + cd )( ab + cd ) = abcd&
输入说明:
输出说明:
输出abcd,从小到大,一行一个。
简  析:
ab,cd是两位数,也就是四位数的前两位和后两位。
[入门095]勾股数
内  容:
求n以内勾股数。(约定a&=b&=c&=n)
若有a*a+b*b=c*c,我们就把a,b,c称为一组勾股数。
若有多组,按a从小到大顺序输出。a值相同的按照b值从小到大输出,类推。。
输入说明:
输出说明:
一行一组三个数,用空格隔开
输入样例:
输出样例:
[入门096]倒立勾股数
内  容:
1/x2+1/y2=1/z2&其中正整数xyz成为一组倒立的勾股数!注意,是正整数哦!
你的任务是输出n以内的倒立勾股数,按x的增序输出(每行一个)。
输入说明:
输出说明:
每一组倒立勾股数一行,即每行三个数依次是X,Y,Z。
输入样例:
输出样例:
简  析:
枚举三个数,然后去逐一检验吧!注意如果直接用题目中公式去计算,1/x2的结果是一个小数,可能会遭遇浮点数误差。不妨将该公式变化一下&&
[入门097]买纽扣
内  容:
用5元钱买100只钮扣,其中金属钮扣每只 5 角,有机玻璃钮扣每只1角,小揿扣 1分钱买 3个,编程求出各种钮扣各买了多少只?
输入说明:
输出说明:
一行,3个整数,分别代表金属扣,有机扣,揿扣
简  析:
我相信你已经可以独立完成本题了,但是却要在这里啰嗦上几句。我们有没有必要进行三层循环,分别枚举三种纽扣的数量?我们是否有必要将每种纽扣的数量从0枚举到100?
要多从不同的角度去探讨问题,算法研究不仅仅是提出一个解决方案,还应该是寻找解决问题的更有效的方法。对于枚举的优化,就是选择合适枚举对象、合适的枚举范围,减少最内层判断的次数、降低判断的难度。
[入门098]小球颜色方案
内  容:
一个看不见的袋子中装有红、橙、黄、绿、蓝等 k 种颜色的小球若干,每次随意摸出三个小球,输出三个小球颜色都不一样的所有可能组合的方案总数。
{红、绿、蓝} 与 {红、蓝、绿}视作同一种方案。
输入说明:
一个整数k,表示小球的颜色数。(3&=k&=20)
输出说明:
一个整数,三球异色的方案数。
输入样例:

我要回帖

更多关于 满足条件的单元格求和 的文章

 

随机推荐