C++ For讲解与一本通平台讲解
C++ For讲解~for 是什么for 是 C++ 中的保留字(说了N遍),作用是极其常见的,每个程序都可能会有(废话)。所以学好 for 语句是十分重要的。(简单来说就是学不好就干不了什么)
for 有什么用
而 for 是一种循环,它可以重复执行其括号内的语句。大大节省了代码量。
例如,从 1 输出到 100,在没学过 for 语句之前是这么做的:
#include<iostream>
using namespace std;
int **in(){
cout<<1<<' '<<2<<' '<<3<<' '<<......<<97<<' '<<98<<' '<<99<<' '<<100<<endl;
return 0;
}
而学过循环后,是这么做的:
#include<iostream>
using namespace std;
int **in(){
for(int i=1;i<=100;i++)
cout<<i<<' ';
return 0;
}
一眼望去,学过 for 语句会使程序更加轻巧。
for 语句教程
现在,我们来学习 for 语句。
下面是 for 语句的格式:
for(控制变量初始化表达式;条件表达式;增量表达式)
语句1;
可能有些难理解,首先,控制变量初始化表达式 是指 初始化控制 for 语句执行的变量,也就是说,这里的变量用于确定 for语句是否执行,起到的是 定义 的作用。
然后,条件表达式 是指 判断条件是否成立,如果成立则执行,否则跳出循环,它起到了 停止循环 的作用。
较后,增量表达式 是指 循环执行中改变变量 ,它起到了 改变循环中的数据 的作用。
for(控制变量初始化表达式;条件表达式;增量表达式){
语句1;
语句2;
...
}
for 语句可以使用大括号括起来,以执行多个语句。
for 语句执行过程
首先,程序执行 for 语句分为已下几个步骤:
初始化了 for 语句的控制变量。
查看条件表达式,看看其是否成立,当成立时执行3,不成立则跳出整个 for 语句。
执行其内部语句。
根据增量表达式变化变量。
回到2。
for 语句实例
相信大家都明白了 for 语句怎样执行的了。
下面是 for 语句的一个实例:
#include<iostream>
using namespace std;
int **in(){
int n,sum=0;
cin>>n;//输入 n
for(int i=1;i<=n;i++)//定义 i 变量;当 i 小于 n 时,执行 for 语句;i 变量每次增加 1
sum+=i;//同等于 sum=sum+i;
cout<<sum<<endl;//输出
return 0;
}
这段代码可以看出,执行一次循环,i 就会增加 1,当 i 大于 n 时,就不满足条件表达式里面的条件了,随即跳出循环。输出 sum。(这是一个从 1~n 求和的代码)
其实 for 语句中的什么控制变量初始化表达式,条件表达式和增量表达式,都可以不填,因为它只是说明此变量专门用于判断 for 语句是否执行。所以就可以像这样:
#include<iostream>
using namespace std;
int **in(){
for(;;){
语句1;
语句2;
...
}
return 0;
}
这样的 for 语句虽然可以执行,但其会无限的执行下去。
又例如求和的哪道题,依照这样,可以把控制变量初始化表达式,条件表达式和增量表达式放在语句处。
#include<iostream>
using namespace std;
int **in(){
int n,sum=0,i=1;//初始化变量 i
cin>>n;//输入 n
for(;;){
if(i>n) break;//当 i > n 时跳出循环(break作用),也就是条件表达式的作用
sum+=i;//同等于 sum=sum+i;
i++;//i 每次自增 1,相当于增量表达式
}
cout<<sum<<endl;//输出
return 0;
}
这段代码与上面求和的代码作用相同,只不过是把控制循环的 i 的处理位置放在了别的地方。但是像这样的题,建议使用第一种方法,这种方法比较无聊,有空的地方就可以放 i,没必要在语句里放 i 。
信息学奥赛一本通的题目
2016 - 2019,1059 - 10842016:【例4.1】for循环求和
求和的题目已经当做示例讲过了,这里就不在多讲。
下面是代码:
#include<iostream>
using namespace std;
int **in(){
int n,sum=0;
cin>>n;//输入 n
for(int i=1;i<=n;i++)//定义 i 变量;当 i 小于 n 时,执行 for 语句;i 变量每次增加 1
sum+=i;//同等于 sum=sum+i;
cout<<sum<<endl;//输出
return 0;
}
讲~ 过~ 了~
2017:【例4.2】输出偶数
这题用 for 语句模拟从 1~n 的每一个数,在判断它是否为偶数,如果是偶数就输出,否则什么也不干。这里要用到之前学的 if 语句,不会的可以去我之前的 C++ If讲解与一本通平台讲解 来看看。(强行推荐)
下面是代码:
#include<iostream>
using namespace std;
int **in(){
int i,n;
cin>>n;
for(i=1;i<=n;i++)//枚举从 1 到 n 的所有数
if(!i&1)//当 i 不是奇数时
cout<<i<<' ';//输出
return 0;
}
当然,这样是可以,但如果数据大了,就像 1000000000 这样,要是用一个个去枚举,计算机早就超时了,怎么办?
思考一下,从 1~n 的偶数有怎样的特征?
2,4,6,8,10...
是不是每隔一个数就是一个偶数呢?利用这个特点,可以做出时间复杂度相对较简单的代码。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n;
cin>>n;
for(i=2;i<=n;i+=2)//从 2 开始,每隔 1 个数就是一个偶数(就是加上2)
cout<<i<<' ';//因为 i 一直是偶数,所以可以直接输出
return 0;
}
这就是一种优化。
2018:【例4.3】输出奇偶数之和
Emmm...这题只是与上面的有亿点不同。仔细想想就可以得出,只要用一个 sum 去把每次算出的奇偶数累加就可以了。但是因为它有两项,所以要用特殊的方法处理。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n,sum=0,ans=0;
cin>>n;
for(i=1;i<=n;i++)
if(i&1)
ans+=i;
else
sum+=i;
cout<<sum<<' '<<ans<<endl;
return 0;
}
与上一题类似。
2019:【例4.4】求阶乘
阶乘是什么?(只对不懂什么是阶乘的人的教程,懂了的可以不看)
阶乘与乘方不是一个东西,千万不要搞混了,阶乘指的是从 1~n 的所有整数的乘积
1*2*3*4*5*...*n=n!
阶乘是个十分神奇的东西...
1! = 1,2! = 2,3! = 6,4! = 24,5! = 120,6! = 720,7! = 5040,8! = 40320,9! = 362880
这里都还能接受
10! = 3628800,11! = 39986100,12! = 479001600,13! = 6227020800,14! = 87178291200,15! = 130767436800,16! = 20922789888000,17! = 355687428096000,18! = 64023373705728000,19! = 121645100408832000,20! = 2432902008176640000
到这里已经很大了,所以,阶乘不是一个很好算的东西。但是,出题者十分好,把阶乘定在了1<=n<=20,刚好,long long 可以装下。
20!=2432902008176640000<2(64次方)=18446744073709551616
20!=2432902008176640000>2(32次方)=4294967296
long long 存放的范围大于 20!,但 int 小了,所以这题用 long long 才行。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n;
long long sum=1;//这里是个坑,不能像其他那样初始化为 0 ,因为 0 乘任何数都为 0
cin>>n;
for(i=1;i<=n;i++)//枚举 1~n 的数
sum*=i;//累乘
cout<<sum<<endl;
return 0;
}
过~
1059:求平均年龄
平均年龄怎么求?用年龄总和 ÷ 人数。因为此题要用到浮点数,所以要用 float 。(当然double也行,但是 double 比较慢,可以用 float 时就尽量用 float)
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int i,n,x;
double sum=0;//初始化
cin>>n;//输入
for(i=1;i<=n;i++){//循环控制输入个数
cin>>x;//依次输入
sum=sum+x;//累加输入
}
printf("%.2lf",sum*1.0/n);//输出累加和/人数的商
return 0;
}
这道题很简单,但是可能有人会有疑惑(吧,因为我之前也有,呵呵),for 语句中的输入是读一次就要求输入一次,每次输入的值都会覆盖当前的值。(以前不懂...)
1060:均值
与上一题类似,都是求平均值。
直接上代码:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int i,n;
double x,sum=0;
cin>>n;//输入 n
for(i=1;i<=n;i++){//输入 n 次
cin>>x;//输入 x
sum=sum+x;//累加
}
printf("%.4lf",sum*1.0/n);//输出平均值
return 0;
}
过~~
1061:求整数的和与均值
就多了个求和。
下面是代码:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int i,n,x,sum=0;
cin>>n;//输入数据个数
for(i=1;i<=n;i++){//循环 n 次
cin>>x;//输入
sum=sum+x;//累加
}
printf("%d %.5lf",sum,double(sum)*1.0/n);//输出
return 0;
}
过~~~
1062:较高的分数
这题就是求较大值,靠的就是打擂台的方式,这种方式我在讲解 2056:【例3.7】较大的数 时就讲过了。而多个数据打擂台也是同样使用一个一个找的方法。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int i,n,x,**xn=-1;//**xn 初始化**小值
cin>>n;
for(i=1;i<=n;i++){
cin>>x;//输入 n 个数
if(x>**xn)//如果这个数要比当前的较大值大的话
**xn=x;//把较大值给 **xn
}
cout<<**xn<<endl;//输出较大值 **xn
return 0;
}
打擂台是找较大值的最简单的方式。
1063:较大跨度值
题目已经说了
较大跨度值 = 较大值减去**小值
所以,我们要做的就是找出较大值和**小值,然后用较大值减**小值。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int **xn=0,i,n,x,minn=1001;//较大值定义一个小值,**小值定义一个大值
cin>>n;
for(i=1;i<=n;i++){
cin>>x;//循环输入
if(**xn<x)//如果它大于较大值
**xn=x;//覆盖
if(minn>x)//如果它小于**小值
minn=x;//覆盖
}
cout<<**xn-minn<<endl;//输出较大值减**小值
return 0;
}
过~~~~
1064:奥运奖牌计数
没什么好讲的,直接累加。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n,x,j,y,t,jsum=0,ysum=0,tsum=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>j>>y>>t;//输入金银铜牌数量
jsum=jsum+j;//累加金牌数量
ysum=ysum+y;//累加银牌数量
tsum=tsum+t;//累加铜牌数量
}
cout<<jsum<<" "<<ysum<<" "<<tsum<<" "<<jsum+ysum+tsum<<endl;//输出
return 0;
}
过~~~~~
1065:奇数求和
把 2018 改亿下就行了。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int n,m,sum=0;
cin>>n>>m;
for(n;n<=m;n++){//增量不一定为 i
if(n&1)//是否为奇数
sum=sum+n;//累加
}
cout<<sum<<endl;//输出
return 0;
}
过~~~~~~
1066:满足条件的数累加
这就是吧上一题换了个条件,其他都一样。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,x,y,sum=0;
cin>>x>>y;//输入
for(i=x;i<=y;i++)//枚举
if(i%17==0)//判断条件是否成立
sum=sum+i;//累计
cout<<sum<<endl;//输出
return 0;
}
过~~~~~~~
1067:整数的个数
很简单,定义三个变量,分别累加即可。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n,x,sum1=0,sum5=0,sum10=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
if(x==1)//是否为 1
sum1++;//累加
else
if(x==5)//是否为 5
sum5++;//累加
else
if(x==10)//是否为 10
sum10++;//累加
}//此处可以用 switch 大家可以试试
cout<<sum1<<endl<<sum5<<endl<<sum10<<endl;//输出
return 0;
}
用 switch 试试吧。
1068:与指定数字相同的数的个数
改变一下判断就行了。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int n,y,x,i,sum=0;
cin>>n>>y;
for(i=1;i<=n;i++){
cin>>x;
if(x==y)//满足条件
sum++;//累加
}
cout<<sum<<endl;//输出
return 0;
}
简单
1069:乘方计算
这题就是乘方了,不是阶乘。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,a,n,sum=1;
cin>>a>>n;
for(i=1;i<=n;i++)
sum=sum*a;//累乘
cout<<sum<<endl;//输出
return 0;
}
其实可以用 c**th 中的 pow 函数的。(比较偷懒)
1070:人口增长
按照题意算即可。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int i,n;
double x;
cin>>x>>n;
for(i=1;i<=n;i++)
x=x*1.001;//0.1% = 0.001
printf("%.4lf",x);
return 0;
}
弄清题意即可
1071:菲波那契数
使用迭代的方式向前拓展。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n;
long long x=1,y=1,z;
cin>>n;
for(i=1;i<=n-2;i++){//注意是到 n-2 否则会超界
z=x+y;//计算新的数
y=x;//迭代...
x=z;//迭代...
}
cout<<x<<endl;
return 0;
}
迭代拓展
1072:鸡尾酒疗法
算好即可。
代码如下:
#include<iostream>
using namespace std;
int **in(){
long a,b,n;
double x,y;
cin>>n;
cin>>a>>b;
x=b/(a/1.0);
for(int i=2;i<=n;i++){
cin>>a>>b;
y=b/(a/1.0);
if(y-x>0.05)//判断
cout<<"better"<<endl;
else
if(x-y>0.05)
cout<<"worse"<<endl;
else
cout<<"same"<<endl;
}
return 0;
}
输出的字符不能错了,错了是十分吃亏的。
1073:救援
找到求的方式,在有一些基础知识即可做出。
代码如下:
#include<cstdio>
#include<c**th>
using namespace std;
int **in(){
int i,n,p=0;
double time=0,x=0,y=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>x>>y>>p;//输入
time+=sqrt(x*x+y*y)/25.0+p*1.5;//求出时间
}
printf("%d",int(ceil(time)));//输出结果
return 0;
}
要算好,不能写错数字。
1074:津津的储蓄计划
这个题只要模拟好每个月的金钱变化,确保无误。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int n,sum=0,s=0,yu,y;
for(int i=1;i<=12;i++){
s+=300;
cin>>n;
yu=s-n;
if(yu<0){//出现负数,直接退出
cout<<"-"<<i;
break;
}
if(yu/100!=0){//保存整百的钱
sum=sum+(yu/100)*100;
yu=yu-(yu/100)*100;
}
s=yu;
if(i==12){//加倍奉还
y=s+sum+(sum/10)*2;
cout<<y;
}
}
return 0;
}
控制好每个月的金钱变化。
1075:药房管理
这道题是我卡的最久的...(其实是读不懂题目的样例...)
下面是代码:
#include<iostream>
using namespace std;
int a[101];//用了数组...
int **in(){
int sum=0,m,n,i;
cin>>m>>n;
for(i=1;i<=n;i++){
cin>>a;
if(m>=a)
m-=a;
else
sum++;
}
cout<<sum<<endl;
return 0;
}
用了数组,可能不好理解。
1076:正常血压
这题是求最长的持续时间,这是一个要注意的点。
下面是代码:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int n,i,x,y,sum=0,**x=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>x>>y;
if(x>=90&&x<=140&&y>=60&&y<=90){//判断是否正常
sum=sum+1;
if(**x<sum)//判断是否比最长时间长
**x=sum;//覆盖较大值
}
else
sum=0;//重置
}
cout<<**x<<endl;//输出
return 0;
}
明白了题意就十分简单了。
1077:统计满足条件的4位数
利用对四位整数的按位分离,求出千,百,十,个位,再进行计算。
下面是代码:
#include<iostream>
using namespace std;
int **in(){
int i,a,b,c,d,e,n,sum=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>a;
b=a%10;//分离个位
c=a%100/10;//分离十位
d=a%1000/100;//分离百位
e=a/1000;//分离千位
if((b-c-d-e)>0)//计算,判断是否成立
sum=sum+1;
}
cout<<sum<<endl;
return 0;
}
分离是重点。
1078:求分数序列和
分数序列:
,其中
根据序列变化来做,代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int i,n;
double sum=0,x=2,y=1,z=0;
cin>>n;
for(i=1;i<=n;i++){
sum=sum+x/y;
z=x;//变换
x=x+y;
y=z;
}
printf("%.4lf",sum);
return 0;
}
跟着题意走,分数九十九;再来点细节,AC不再竭。(奇怪的顺口溜...)
1079:计算分数加减表达式的值
分数加减表达式:
单数时是加,双数时是减。
根据这个求出值即可。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int n,i;
double sum=0;
cin>>n;
for(i=1;i<=n;i++){
if(!i&1)//判断是加是减
sum=sum-1.0/i;//减
else
sum=sum+1.0/i;//加
}
printf("%.4lf\n",sum);
return 0;
}
简单的判断就可以带过此题。
1080:余数相同问题
这题用来枚举的...
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,a,b,c;
cin>>a>>b>>c;
for(i=2; ;i++){//没有结束的条件
if(a%i==b%i&&b%i==c%i){//满足条件
cout<<i<<endl;//直接输出
return 0;//直接退出
}
}
}
暴力出奇迹...
1081:分苹果
此题较好的方法是第一个分 1 个,第二个分 2 个,第三个分 3 个...以此类推。
较后求出总共需要的苹果数量。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n,sum=0;
cin>>n;
for(i=1;i<=n;i++)//循环
sum=sum+i;//累加结果
cout<<sum<<endl;//输出
return 0;
}
不公平的分法...
1082:求小数的某一位
这道题可以模拟我们做除法竖式时所做的事,也就是求商,余。
代码如下:
#include<iostream>
using namespace std;
int **in(){
int i,n,x,y,v,sum=0;
cin>>x>>y>>n;
for(i=1;i<=n;i++){//做竖式的过程
x=x*10;
v=x/y;
x=x%y;
}
cout<<v<<endl;//输出
return 0;
}
利用做除法竖式的过程可以轻易解决这个问题。
1083:计算星期几
这题所做的乘方运算太大,long long 都装不下,但是要确切的数字有什么用呢,它一直在一周(7天)内循环,只要求出距离今天过了几天就行了,所以,在求乘方时可以将它 mod 7。
下面是代码:
#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
int n,i,a,b;
cin>>a>>b;
n=1;
for(i=1;i<=b;i++)
n=n*a%7;//一直 mod 7
switch(n){//判断过了几天
case 0:cout<<"Sunday"<<endl;break;
case 1:cout<<"Monday"<<endl;break;
case 2:cout<<"Tuesday"<<endl;break;
case 3:cout<<"Wednesday"<<endl;break;
case 4:cout<<"Thursday"<<endl;break;
case 5:cout<<"Friday"<<endl;break;
case 6:cout<<"Saturday"<<endl;break;
}
return 0;
}
mod 7 是至关重要的一步。
1084:幂的末尾
与上一题相似,出来末尾的三个数,其他位置上的数不可能影响到后三位数,所以,我们每次只需保留后三位即可。
下面是代码:
#include<iostream>
using namespace std;
int **in(){
int a,b,k=1,i=1;
cin>>a>>b;
for(i;i<=b;i++){//模拟过程
k*=a;//计算乘方
k%=1000;//取后三位
}
if(k>=100)//特判
cout<<k<<endl;
else if(k>=10)//特判
cout<<"0"<<k<<endl;
else//特判
cout<<"00"<<k<<endl;
return 0;
}
较后的特判不能忘了。
好了,题目都讲完了。
转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。
链接:C++ For讲解与一本通平台讲解http://www.gufeng7.com/niaolang/1845.html
联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com
上一篇: C++ If讲解与一本通平台讲解
下一篇: C++ 入门讲解