if结构 同一个问题,尽量写成一整坨 switch(值){ case 值1: case 值2: case 值3: default: } 匹配到符合条件的值后,开始执行接下来的【所有】语句,直到运行结束或遇到break break通常与switch语句搭配使用,但不是必须的 switch执行的效率,远高于if(if 爬楼梯 switch 坐电梯) if使用没有限制,switch必须使用固定的值,或有限的可表示范围 while结构 与for结构可以任意替换,没有区别 循环次数:0~无数次 在不确定具体循环次数的情况下,使用while更好 for结构 与while结构可以任意替换,没有区别 循环次数:0~无数次 在确定循环次数或有具体范围的情况下,用for更好 do{ 代码坨 }while(条件); 先执行一次代码坨,再根据条件判断重复还是结束 与while和for不能任意替换 循环次数:1~无数次 在正常情况下,不用 break 跳出结构(循环和switch) continue 从新开始循环(仅限循环) 所有结构可以相互嵌套形成一整坨 累加问题 (1、范围,2、初始值 0 ,3、累加项 +相关) 已知:s=1+2+3+ ... n 输入n输出s int s=0; for(int i=1;i<=n;i++){ s+=i; } cout<<s; 已知:s=1/1+1/2+1/3+ ... 1/n 输入n输出s double s=0; for(int i=1;i<=n;i++){ s+=1.0/i; } cout<<s; 已知:s=1+2+3+ ... n 输入k,输出n=?使s>k int i=1,n; int s=0; while(1){ s+=i; if(s>k){ n=i; break; } } cout<<n; 累乘问题 (1、范围,2、初始值 1 ,3、累乘项 *相关) 具体变化同上累加 小青蛙喜欢游泳,最开始蹬一次腿儿2.0米, 后面越游越累,后面的每次是前一次的0.98倍 已知目的地距离当前位置x米远,蹬几次可以游到目的地 输入x,输出次数 s=2.0+2.0*0.98+2.0*0.98*0.98+2.0*0.98*0.98*0.98 累加项:2.0*k个0.98相乘 double s=0; double i=2.0; int k=0,n; while(1){ s+=i*pow(0.98,k); k++; if(s>=x){ n=k; break; } } cout<<n; double s=0; double i=2.0; int k=0,n; while(1){ s+=i; i*=0.98; k++; if(s>=x){ n=k; break; } } cout<<n; 已知图书编码是一个13位数字 将图书编码中的前12位里的奇数位*-1,偶数位*3, 将各个位的结果相加得到和 将和mod 10,得到的结果如果与第13位相同,则是正版书,否则是盗版 输入图书编码,输出正版或盗版 1111111111111 1*-1+1*3+1*-1+1*3+1*-1+1*3+1*-1+1*3+1*-1+1*3+1*-1+1*3=12 12%10=2 2 1 -> 盗版 long long a; int yz=a%10; a/=10; int s=0; int k=3; while(1){ s+=a%10*k; a/=10; if(k==3) k=-1; else k=3; if(a<=0) break; } if(s%10==yz) ... else ... 数字拆分的过程中,无论数字多长(整数类型范围内) 查看取余或整除中1后边的0的个数,0的数量,决定了保留或去掉的位数 123456789 1234 /100000%10 456789 %1000000/100000 %保留 /去掉 循环数字拆分,从后往前 int a; while(a){ cout<<a%10; a/=10; } 1094 int s=0; for(int i=1;i<=n;i++){ if(i%7==0) continue; bool f=false; int m=i; while(m){ if(m%10==7){ f=true; break; } m/=10; } if(f) continue; s+=i*i; } cout<<s; int s=0; for(int i=1;i<=n;i++){ string str=to_string(i); if(i%7==0||str.find('7')<str.size()) continue; s+=i*i; } cout<<s; //数字拼接 1089 |