总结一下二级c语言常考的知识点:
1、 最大公约数和最小公倍数:(虽然很少可能会考,但还是写一下吧)
利用辗转相除法求最大公约数,程序简单,效率高
思路:输入两个整数:n,m。先用大的数对小的数取余,再用小的数对得到的余数取余,知道余数为0为止,此时上一步的余数就 是最大公约数。举个例子。求24和16的最大公约数,首先24%16=8;然后16%8=0;所以8就是这两个数的最大公约数。
程序代码如下:
int fun(int a,int b){
int r=a;
while(r){
r=b%a;
b=a;
a=r;
}
return b;
}
对于最小公倍数,用两个数中较大的数对所求得的最大公约数取模再乘以较小的数即是最小公倍数。如24,16,求得的最大公约数是8,那么24/8=3,3*16=48.。48便是这两个数的最小公倍数。
2 、关于素数:
素数是常考的一个知识点,考查的方法有很多,判断一个数是否是素数,输出n-m的素数(的个数),输出离n最近的m个素数,筛选法得1-100的素数等问题。不过这些问题都只需要做出细小的调整即可实现。素数的判断方法就不想多说了,说一下怎么用筛选法求素数吧,这是一种较为高效率的算法。
思路:首先我们把所有的数都设置为1(布尔变量),然后把1置0,从2开始,把2*i都置为0,再到3,把3*i都置为0;注意,i>=2;如此反复,这样到最后仍为1的数就是素数了。
代码如下:
#define N 100000007
bool prime[N];
void fun(int n){
int i,k,j;
for(i=2;i<n;i++) //把所有数的布尔值设为1;(从2开始,因为1不是素数)
prime[i]=1;
for(i=2;i<n;i++){
if(prime[i])
for(k=2;i*k<n;k++)
prime[i*k]=0; //把i的倍数都置为0;i=2,3,4,.......n-1。
}
}
执行完这个函数之后布尔值为1的i就可以了
for(i=2;i<n;i++)
if(prime[i])
printf("%d ",i);
筛选法就这样吧。
3、排序问题,排序问题在二级中也很常见,详细见博客里的另一篇文章。
4、指针与数组:
数组实际上是地址,而指针也是地址,所以在函数中,我们经常可以看见函数用指针来接受数组的地址;在fun函数中看见它的形参为一个指针,像fun(int *s,int n)之类的,实参字符型数组时,对应的形参改为char *s就是了。 因此,在写代码的时候,我们可以直接把指针看成数组,把数组看成指针。像fun(int *s,int n),我们可以在函数中直接用s[i];而不需要另外在定义一个数组;
另外,在做题时,我们经常要遍历数组,这时候我们需要设置一个结束标志,即数组的最后一个数遍历完成的标志。一般可以这样写(i=0;s[i];i++) (数组s[]为字符数组时)
5、指针与字符串
这个二级中最常见的一个考点,通常出现在程序设计题中,做这类题关键的还是用好指针,对指针的指向有良好的认知,可以参考博客里的“删除字符串中的指定字符”,那是指针与字符串考点中的一个经典例子。
要使指针指向字符串末尾,通常的做法是:
while(*p)
p++;
这样就可以指向最后一个字符:'\0'了,要求指向最后一个非空字符时,还要再加一条语句,p--;
如果题目中设置了一个空的指针(这里说的空指的是指针没有指向任何东西)来作为函数的返回,这时候我们需要把最后的结果赋给这个指针,如果题目要求的是用原来的指针进行输出,那么一般我们需要在函数中设置一个新的指针来进行指针运算,然后再把最后的结果赋给原来的指针;
怎么样看是用哪个指针进行输出呢?比如main函数中调用fun函数时是这样写的,char a[80]; int n; fun(a,n); 输出语句是这样写的printf("%s",a); 那么fun函数中用于输出的还是a数组,或者说a指针,所以在fun函数里,我们可以定义char *p=a; 把a所指的地址赋给p,再进行后续的运算,最后把运算的结果赋回给a;如果main函数中调用fun函数时是这样写的,char a[80],t[80]; int n; fun(a,t,n); 输出语句是这样写的printf("%s",t); 那么fun函数中用于输出的则是t数组,我们需要把结果赋给指针t。
5、数字的拆分与回文数
关于数字的拆分有时候会考到,数字的拆分就是12345,有时候需要把每个数都拆出来即'1','2','3','4','5'。我们用的方法一般是这个数字先对10取余,再对10取模,不断重复直到模为0;例如:12345%10=5;然后12345/10=1234;1234%10=4;。。。不断重复即可,
关于回文数,就是,顺序和倒序,这个数的值都是一样的,如12321.判断一个数是否是回文数时,做法是,先拆分,再把拆分出来的数倒序组成一个新的数,判断这个数是否与原来的数相等,
详情见代码:(判断n是否是回文数)
int s=0,a,b;
a=n;
while(a){
a=n%10;
n/=10;
s=s*10+a;
}
if(s==n)
这个表达式若成立则为回文数,否则不是。