1:素数判断的进阶
开方可以帮助我们缩小判断范围,提高判断效率。在判断一个数是否为素数时,只需要判断它是否能被小于等于它平方根的所有质数整除即可。如果一个数不能被小于等于它平方根的所有质数整除,那么它就是素数
如下是判断素数的更加节省时间的方法2
#include<bits/stdc++.h>
using namespace std;
bool isprime(int a);
int main() {
int b;
cin>>b;
if(isprime(b)==1)cout<<"yes";
}
bool isprime(int a){
if(a<=1)return 0;
for(int i=2;i*i<=a;i++){
if(a%i==0)return 0;
}
return 1;
}
2: 数组的嵌套运用
主要用于判断数组中一个数出现了多少次
eg:a[b[i]]++;
特别注意区分如下情况
天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。
于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。
输入在第一行中给出一个正整数 N(≤2×104),即参赛学生的总数。随后一行给出 N 个不超过 106 的正整数,是参赛学生的能力值。
第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。
10
86 75 233 888 666 75 886 888 75 666
75 3
888 2
本题正解
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int cnt1=0;
int cnt2=0;
int maxn=0;
int minn=1000010;
for(int i=0;i<n;i++)
{int num;
scanf("%d",&num);
if(num>maxn)
{
maxn=num;
cnt1=1;
}else if(maxn==num)
{
cnt1++;
}
if(num<minn)
{
minn=num;
cnt2=1;
}else if(minn==num)
{
cnt2++;
}
}
printf("%d %d\n",minn,cnt2);
printf("%d %d\n",maxn,cnt1);
return 0;
}
如果再次使用数组的嵌套会出现错误,因为它要两头进注意区分(标记一下)
3:关于数组使用的一些总结
数组空间的问题
![](https://i-blog.csdnimg.cn/blog_migrate/4bdf412daa768e7934823096854b16da.jpeg)
大数组的定义问题
数组初始值
没有赋值的字符串长度为0
改为char s2 110或者令s1初始等于s2
3:读入
不定长度的读入
while (n < 4 && scanf("%d", &nums[n]) == 1)
{
n++;
}
对于要求最多输入4个整数最少一个的程序而言,如果没有n<4的限制其会陷入死循环,
如果你只输入一个整数,例如输入 "18",那么程序的执行如下:
1.程序开始执行,进入 while 循环。
2.n 的初始值为0,所以 n < 4 条件成立。
3.scanf 试图读取整数,成功读取 "18" 并将它存储在 nums[0] 中。此时 n 增加到1。
4.由于 n 仍然小于4,并且输入流中没有其他整数,所以程序继续执行循环。
5.scanf 试图再次读取整数,但由于没有更多整数可供读取,它失败并返回0。
6.循环条件 n < 4 依然成立,但 scanf 的返回值不再是1,因此程序不会再次尝试读取整数。
7.循环继续执行,但由于没有其他整数可供读取,程序在下一次循环迭代中将 n 保持为1,而不再尝试读取整数。
8.因为没有更多整数可供读取,循环最终结束。
最终输出是 "18",因为程序只读取了一个整数并按顺序输出它。这个程序正好符合输入和输出的要求。
题会用到while(cin>>s)来表示一直读到文件结束(可用ctrk+Z模拟文件结束)
scanf的读入
如果%c前没有空格,空格会读入,因为空格也是char型,在%c前加上空格,系统会忽略空格直到读入其他字符+-之类的
eg:
4:小技巧 (经验)
提取各位
/10%10是十位,/100%10是百位,/1000%10是千位,/10000%10是万位,/100000%10是十万位
保险起见
凡是涉及到小数的数据类型保险起见都用double
误差的控制
#include <stdio.h>
#include <math.h>
int main()
{
long int x;
scanf("%ld",&x);
if(floor(sqrt(x)+0.5)==sqrt(x))(去误差)
{
printf("YES");
}
else
{
printf("NO");
}
}
何时停止输入
while(scanf("%ld%ld",&a,&b)!=EOF) 当停止输入
判断闰年
if ((x % 4 == 0 && x % 100 != 0) || (x % 400 == 0))判断闰年
数据类型的转化
a+0.5*b与a+b/2不同(ab都为int时,若都为double则相同)
先输入再定义
千万不要int n,int a(n)然后cin n
这样完全是随机数,老他妈刺激了!!!!!!!!!
当输入0时停止while(n)
Scanf什么什么
精准控制四周与中心
转移字符
更简单的方法是cin>>s;cout>>s;
转义字符是一种特殊的字符序列,用于表示无法直接键入或显示的字符,或者表示具有特殊含义的字符。在许多编程语言和文本处理环境中,包括C++,转义字符通常以反斜杠(\)后跟一个或多个字符的方式来表示。当你使用这些转义字符时,编译器或解释器会将它们替换为特定的字符或执行特定的操作。
以下是一些常见的C++转义字符和它们的含义:
1.\':单引号。用于在字符常量中表示单引号。
char singleQuote = '\'';
2.\":双引号。用于在字符串常量中表示双引号。
std::string doubleQuote = "This is a double quote: \"";
3.\\:反斜杠。用于在字符串中表示反斜杠字符自身。
std::string path = "C:\\Windows\\System32\\";
4.\n:换行。用于在字符串中插入换行符,使文本换行。
std::cout << "Hello,\nWorld!" << std::endl;
5.\t:制表符。用于在字符串中插入制表符,产生水平定位效果。
std::cout << "Name\tAge\tCity" << std::endl;
6.\r:回车。在某些情况下用于将光标移到行的开头。
7.\b:退格。用于在字符串中插入退格字符。
8.\a:响铃。在某些环境中用于触发响铃或提醒操作。
这些是一些常见的C++转义字符,但还有其他更多用于表示特殊字符或执行特定操作的转义字符。转义字符的使用可以帮助您在字符串和字符常量中表示各种特殊字符和控制字符,使您能够以更灵活的方式处理文本和字符数据。
5.c++函数
floor函数向下取整
ceil函数向上取整
round函数四舍五入
tolower函数c++大写转小写
abs绝对值
fmod浮点数之间的取余
isdigit判断一个字符是否为数字