for循环,while循环以及枚举法

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类,头文件学习

:写一个能支持优先级的计算器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值