for 循环
for (初始化:判断条件:增量表达式){
执行语句}
执行顺序:在for这个语句中不断重复直到满足条件跳出循环,执行下一个语句
常见循环结构:
1.固定次数范围
01.重复输出5次hello world
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
for(int i=1;i<=5;i++){
cout<<"hello word!\n";
}
}
问题:这个代码我打完才发现没加 return 0
然后我测试了几次也没问题,那么 return 0的意义是什么呢?
02. 输出1~20的数字
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
for(int i=1;i<=20;i++){
cout<<i<<" ";
}
return 0;
}
2.不定次数范围(输入输出)
01,。输出n次
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cout<<"hello world!\n";
}
return 0;
}
02.限定范围输出数字
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
cout<<i<<" ";
}
return 0;
}
3.增量不同
i++
i--
i+=N
4.嵌套循环
总目标:输入a,b,输出a行b列任意符号
分为 模块
模块1. 用符号替换
大概如下
char x;
cin>>x;
cout<<x;
可以实现一个简易计算器
模块2,循环组成一个符号行
for(int i=1;i<b;i++){
printf("%c",x);
}
模块3.嵌套形成一个面
#include<iostream>
using namespace std;
int main (int argc,char** argv){
int a,b;
char x;
cin>>a>>b;
cin>>x;
for(int j=1;j<=a;j++){
for(int i=1;i<=b;i++){
printf("%c",x);
}cout<<endl;
}
return 0;
}
问题:需要注意输入法为英文,即使是在黑框情况下
否则就会出现这种情况
特别 : int n;
cin>>n;
for(int i=1;i<=n;i++){
cout<<i<<" ";
}cout<<i;//<----------
像这种会在这里报错,因为for循环里int声明的开辟出来的i会在循环后被销毁
int n,i;
cin>>n;
for( i=1;i<=n;i++){
cout<<i<<" ";
}cout<<i;
而这种在外部声明的i才有结果————如下
for循环经典案例求1! + 2! + 3! + ... + n!
# include <stdio.h>
int main(void)
{
int n = 0;
int i = 0;
int m = 1;
int sum=0;
printf("请输入n的值:");
scanf("%d", &n);
for (i=1; i<=n; ++i)
{
m = m * i;
sum = sum +m;
}
printf ("sum = %d\n", sum);
return 0;
}
while循环
while 循环与for的区别:
for在范围和次数确定的时候,处理得比较方便
while在需要满足某种条件不断执行或者满足某条件就停止执行时,使用比较方便
如
int x=-1;
while(x%7!=0{
cin>>x;
}
do while语句:
do{
执行语句;
}while(表达式);//注意这里需要分号
应用
1.位数分离
# include <iostream>
int main(int argc,char** argy)
{
int x;
std::cin>>x;
while(x!=0){
std::cout<<x%10<<std::endl;
x=x/10;
}
return 0;
}
当然这段代码为int类型(四个字节,32位),只能作2^31-1=2147483647内分离位数
2.倒序数处理
# include <iostream>
using namespace std;
int main(int argc,char** argy)
{
int x=0;
int _x=0;
cin>>x;
while(x!=0){
int u =x%10;
x/=10;
_x=_x*10+u;
}cout<<_x;
return 0;
}
枚举法(以下用题目来学习)
一.列举所有可能性
二.筛选判断
1.输入整数n,找出1~n范围内能被整除的数字
枚举类型:1~n
筛选条件:x%3==0
# include <iostream>
using namespace std;
int main(int argc,char** argy)
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
if(i%3==0){
cout<<i<<" ";
}
}
return 0;
}
2.已知_3*6528=3_*8256 求_数字
枚举范围:1~9
筛选条件:左=右
# include <iostream>
using namespace std;
int main(int argc,char** argy)
{
for(int i=1;i<=9;i++){
int left=(i*10+3)*6528;
int right=(30+i)*8256;
if(left==right){
cout<<i<<" ";
}
}
return 0;
}
3.ABCD*E=DCBA
# include <iostream>
using namespace std;
int main(int argc,char** argy)
{
for (int a=1;a<=9;a++){
for(int b=0;b<=9;b++){
for(int c=0;c<=9;c++){
for(int d=1;d<=9;d++){
for (int e=1;e<=9;e++){
if((a*1000+b*100+c*10+d)*e==(d*1000+c*100+b*10+a)){
cout<<"a:"<<a<<"b:"<<b<<"c:"<<c<<"d:"<<"e"<<e<<endl;
}
}
}
}
}
}
return 0;
}
1*辅助标记(flag)
质数判断
# include <iostream>
using namespace std;
int main(int argc,char** argy)
{
int x;
cin>>x;
int flag=1;
if(x<2) flag=0;
for(int i=2;i<x;i++){
if(x%i==0){
flag=0;
break;
}
}if(flag==1){
cout<<"yes";}
else{
cout<<"no";
}
return 0;
}
总结:所有情况都满足某状态(初始状态);只要有一个情况不满足则属于另一种状态
(特殊状态--遍历过程中需要判断)
优化枚举
1.缩小枚举范围
1_偶数去除
2_优化原理:素数是因子为1和本身, 如果num不是素数,则还有其他因子,其中的因子,假如为a,b.其中必有一个大于sqrt(num) ,一个小于sqrt(num) 。所以必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即一个合数一定含有小于它平方根的质因子。(2_为查询csdn内部所得)
————————————————
版权声明:本文为CSDN博主「K o a l a」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43695957/article/details/116062333
# include <iostream>
using namespace std;
int main(int argc,char** argy)
{
int x;
cin>>x;
int flag=1;
if(x<2) flag=0;
if(x%2==0&&x!=2){
flag=0;
}else{
for(int i=3;i*i<x;i+=2){
if(x%i==0){
flag=0;
break;
}
}
}if(flag==1){
cout<<"yes";}
else{
cout<<"no";
}
return 0;
}
2.改变枚举对象
如i+j+k=100
不必把每一个变量都枚举出来
可以int k=100-i-j
思考:最好把代码写得像积木一样 每一个积木块都是相对十分独立的个体 通过小的模块拼接成大的模块
至此,本周c++学习结束
下周目标:数组,string类,头文件学习
:写一个能支持优先级的计算器