机试做题规范及细节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37053885/article/details/88077986

机试做题规范及细节

1.程序的输入

//一般整形变量的输入
int n;
while(scanf("%d",&n)!EOF){//EOF表示输入文件结束或输入ctrl+z时停止循环
//do work

}

//一般long long变量的输入
long long n;
while(scanf("%lld",&n)!EOF){
//do work

}

//字符的输入
char c;
while((c=getchar())!=EOF){
     getchar();//接受回车符,避免c从缓冲区内读取回车符
     printf("%c\n",c);
}
while(scanf("%c",&c)!=EOF){//scanf("%c")也是接受回车作为输入的
     getchar();//接受回车符,避免c从缓冲区内读取回车符
     printf("%c\n",c);
}


//字符串的输入
char a[1000];
while(gets(a)){//以回车作为结束,空格是合法输入字符
//do work

}

//double类型的输入和输出
double a;
scanf("%lf",&a);
printf("%f",a);

如果是用到了C++中的string类定义变量,那么由于C中没有对应的输入函数,需要采用C++中的cin输入流作为输入,同时输出也必须采用cout。

#include <string>//注意区别于string.h头文件,strlen()函数是在string.h中定义的,string中相应的函数为string.size()

string b;
while(cin>>b){//注意输入以
     cout<<b<<endl;
}
return 0;

2.避免不必要的操作

①防止溢出(转换求解顺序)

(a*b)%c--->((a%c)*(b%c))%c
a*b/c  --->a/c*b

②避免不必要的运算

一些比较费时的计算不要放在for循环的条件语句里面

//example:遍历字符串的情形
char a[1000];
for(int i=0;i<strlen(a);i++)
//改进如下
int length=strlen(a);
for(int i=0;i<length;i++)
//example:设计到素数的求解情形
int n=1000000;
for(int i=0;i<int(sqrt(n)+1);i++)
//改进如下
int bound=int(sqrt(n)+1);
for(int i=0;i<bound;i++)

③高内存占用的变量定义为全局变量

在c/c++中,栈空间一般比较小,主要用于存储函数的相关局部变量,形参等等。而全局变量一般和静态变量存储在全局区(静态区),其空间较大,所以对于较大的变量,如a[1000000],最好定义为全局变量,这样可以防止栈空间溢出。

3.提高计算效率

由于计算机中的数字是按照二进制存储的,将一些运算转化为位运算可以调高运行的速度

if(b%2==1)
//等价于
if(b&1)//与1求与运算,即判断最后一位是否为1
b/=2;
//等价于
b>>=1;//左移一位

4.实用技巧

①空间换时间

打表法,在输入程序之前先进行预处理,然后将结果存储起来,方便后续的程序直接使用。例如:需要求满足某些性质的素数,那么我们可以先用素数筛等方法先把所有的范围内的素数求解并储存,方便后续直接调用。

②STL内置函数即数据机构

最典型的就是sort函数了,采用sort函数可以完成指定数组的升序,降序排序等操作。而且其采用插入排序+快排对排序过程进行优化,比我们直接手写的排序函数效率高了不少,由于sort函数默认是升序排序的,所以对于降序排序这里举个例子。

#include <iostream>
#include <algorithm>
#define N 10
using namespace std;

bool cmp(int x,int y){
    return x>y;
}
int A[N]={1,3,5,7,9,2,4,6,8,10};
int main()
{
    sort(A,A+N,cmp);
    for(int i=0;i<N;i++)
        printf("%d ",A[i]);
    return 0;
}

sort也可以对string类型进行排序,具体就是按照从前到后的每一个字符逐一地比较ASCII值的大小。

同时需要注意的是有时候我们的排序对象不仅仅是简单的数据类型,有可能是对象,以结构体对象为例,在下面的例子中我们根据学生的年龄进行升序排序。

#include <iostream>
#include <algorithm>
#define N 3
using namespace std;

struct Student{
    int age;
    char name[10];
};

bool cmp(Student x,Student y){
    return x.age<y.age;
}

int main()
{
    Student buf[N]={{19,"Lee"},{20,"Ive"},{15,"JK"}};
    sort(buf,buf+N,cmp);
    for(int i=0;i<N;i++)
        printf("name:%s,age:%d\n",buf[i].name,buf[i].age);
    return 0;
}

对于有些排序问题可能存在数值相同的元素,因此处理该情况一般要采用稳定排序函数stable_sort函数,stable_sort的用法与sort一致,区别是stable_sort函数遇到两个数相等时,不对其交换顺序;这个应用在数组里面不受影响,当函数参数传入的是结构体时,会发现两者之间的明显区别;比如清华大学2000年的机试题,由于是结构体排序,需要采用stable_sort才能通过。

除此之外,还有比较常用的map数据结构,可以实现不同数据类型之间的hash映射,比采用数组来记录hash映射信息的方法更为高效。

猜你喜欢

转载自blog.csdn.net/qq_37053885/article/details/88077986