计算机复试上机C/C++算法积累

原创 2012年03月22日 20:20:48

 

C/C++字符串处理

strncpy(a,b,5);

a[5]='\0';

 

char a[10];

memset(a,'#',sizeof(a));

a[10]='\0';

 

C

char st[100];

1. 字符串长度

   strlen(st);

2. 字符串比较

   strcmp(st1,st2);

   strncmp(st1,st2,n);   st1,st2的前n个进行比较。

3. 附加

   strcat(st1,st2);

   strncat(st1,st2,n);   n表示连接上st2的前n个给st1,在最后不要加'\0'

4. 替换

   strcpy(st1,st2);

   strncpy(st1,st2,n); n表示复制st2的前n个给st1,在最后要加'\0'

5. 查找

   where = strchr(st,ch)   ch为要找的字符。

   where = strspn(st1,st2); 查找字符串。

   where = strstr(st1,st2);

 

C++

#include <string>

string str;

1. 字符串长度

   len = str.length();

   len = str.size();

2. 字符串比较

   可以直接比较

   也可以:

   str1.compare(str2);

   str1.compare(pos1,len1,str2,pos2,len2); 值为负,0 ,正。

   nops 长度到完。

3. 附加

   str1 += str2; 

   str1.append(str2);

   str1.append(str2.pos2,len2);

4. 字符串提取

   str2 = str1.substr();

   str2 = str1.substr(pos1);

   str2 = str1.substr(pos1,len1);

   string a=s.substr(0,4);       //获得字符串s中从第0位开始的长度为4的字符串

5. 字符串搜索

   where = str1.find(str2);

   where = str1.find(str2,pos1); pos1是从str1的第几位开始。

   where = str1.rfind(str2); 从后往前搜。

6. 插入字符串

   不是赋值语句。

   str1.insert(pos1,str2);

   str1.insert(pos1,str2,pos2,len2);

   str1.insert(pos1,numchar,char);    numchar是插入次数,char是要插入的字符。

7. 替换字符串

   str1.replace(pos1,str2);

   str1.replace(pos1,str2,pos2,len2);

8. 删除字符串

   str.erase(pos,len)

   str.clear();

9. 交换字符串

   swap(str1,str2);

10. C --> C++

   char *cstr = "Hello";

   string str1;

   cstr = cstr;

   string str2(cstr);

 

关于sprintf应用:将数打印到字符串中

char s[ ];

int a;

double b;

sprintf(s,"%d",a);

sprintf(s,”%.2lf”,b); //b精确到小数点后两位,并打印到s

 

字符串左循环移位

string a, c;

lena=a.length();

for(i=0;i<lena;i++)

{

       c=a.substr(i);    //从位置i开始复制字符串到末尾,向左循环

       c.append(a,0,i);  //把字符串a,从位置0开始复制i个到字符串c

    cout<<c<<endl;

}

 

 

小数点后几位输出

C:

double ans;

print("%.2lf\n",ans);

 

%lf double   %f float  %d int  %ld long  %c char

 

C++:

#include <iomanip>

double ans

cout<<fixed<<showpoint<<setprecision(2)<<ans<<endl;

 

格式对齐,C++默认是右对齐

cout.width(20);

cout<<s<<endl;  //结果是右对齐

 

cout.width(20);

cout.setf(ios_base::left);

cout<<s<<endl;  //结果是左对齐

 

C输入输出

int a , b;

scanf(“%d%d”,&a,&b);

printf(“%d%d”,&a,&b);

 

math函数库

#include <math.h>

求平方根   double c=sqrt(a);

x的y次得用函数  pow(x,y),x为double,y为int

开方 开x的y次方  pow(x,1/y)

 

关于map容器

#pragma warning(disable:4786)

#include <map>

 

map<string,int> m;

string a="hello";

如果m[a]没赋值,那么m[a]=0;

 

map<string,string> m;

如果m[a]没赋值,那么m[a]="";

 

判断素数

1.从2一直到sqrt(x)判断法

bool jude(int x)

{

    if(x==1 || x==0) return false;

    double m=sqrt((double)x);

    for(int i=2;i<=m;i++)

        if(x%i==0) return false;

    return true;

}


 

 

2.筛法判断素数

bool isprime[1000000+5]

memset(isprime,true,sizeof(isprime));

isprime[0]=isprime[1]=false;

for(i=2;i<1000000+5;i++)

{

    if(isprime[i]==true)

    {

        temp=2*i;

        while(temp<1000000+5)

        {

            isprime[temp]=false;

            temp+=i;

        }

    }

}


 

 

sort( )函数用法

#include <algorithm>

 

bool cmp(int a,int b)

{

     return a>b;

}

int a[10];

sort(a,a+10,cmp);

 

stable_sort(a,a+10,cmp);

//稳定排序方法 对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的。


 

 

stack和queue

1.About stack

#include <stack>

stack<int> s;

s.push(a);

while(!s.empty)

{

    cout<<s.top();

    s.pop();

}

 

int size=s.size();


 

 

2.About queue

#include <queue>

queue<string> Q;

 

Q.push(s);

while(!Q.empty())

{

    cout<<Q.front();

    Q.pop();

}

 

cout << "The first element is " << Q.front()

     << " and the last element is " << Q.back() << endl;

 

int size=Q.size();


 

 

priority_queue

#include <queue>

empty() true if the priority queue has no elements

pop() removes the top element of a priority queue

push() adds an element to the end of the priority queue

size() returns the number of items in the priority queue

top() returns the top element of the priority queue

 

priority_queue< Node,vector<Node>,greater<Node> > Q;

 

//greater 从小到大排列

about the overrading of greater,you must write,重载时greater用operator>

bool operator>(Node a)

{

    return a.x > b.x;

}

 

//less从大到小排列

priority_queue<Node> Q;

priority_queue<Node,vector<Node>>Q;

这两种方式都可以

默认的是less函数比较 从大到小 ,重载less时要用 operator<

 

千万不要忘了初始化

尤其对于循环输入数据的题

对于stack queue

都要考虑到 empty()的问题

stack or queue 空了,就不能再用s.top() or q.top() 这样会出错。

每次新循环,都要将stack or queue 腾空

 

并查集找根

1.不改变集合元素值

int findr(int x)

{

    int r=x;

    while(u[r]!=r)

    r=u[r];

    return r;

}


 

 

2.改变并查集元素值,使每个元素都直接指向根,为以后查找提供方便

int findr(int r)

{

    if(u[r]==r) return r;

    u[r]=findr(u[r]);

    return u[r];

}


 

 

深度优先(DFS)搜索

//从x点开始搜索矩阵g[][],并用visit[]标记

void DFS(int x)

{

    visit[x]=1;

    for(int j=1;j<=n;j++)

        if(visit[j]==0 && g[x][j]==1)

            DFS(j);

}


 

Dijkstra寻找单源最短路径

关于dijkstra如果有多个起点,或多个终点,可以再加两个点,一个连接所有起点,另一个链接所有终点,并设两点间值为零。

 

#define max INT_MAX

int g[200+2][200+2];

int dis[200+2],pre[200+2];

bool set[200+2]; 

//模板函数

int dijkstra(int x,int y,int citynum)

{

    int i,j;

    for(i=1;i<=citynum;i++)

    {

        dis[i]=g[x][i];

        set[i]=false;

if(dis[i]==INT_MAX) pre[i]=0;

        else pre[i]=s;

    }

    dis[x]=0;set[x]=true;

    for(i=1;i<citynum;i++)

    {

        int temp=max;

        int u=x;

        for(j=1;j<=citynum;j++)

            if(!set[j] && dis[j]<temp)

            {

                u=j;

                temp=dis[j];

            }

        set[u]=true;

        for(j=1;j<=citynum;j++)

            if(!set[j] && g[u][j]<max)

            {

                int newdis=dis[u]+g[u][j];

                if(newdis<dis[j])

{

dis[j]=newdis;

pre[j]=u;

}

            }

    }

    return dis[y];

}

相关文章推荐

算法之美——浙大计算机研究生复试上机考试-2009年

XXX定律 [cpp] view plaincopy #include "iostream"   using namespace std;   ...

考研计算机上机复试算法

  • 2011年02月15日 11:15
  • 689KB
  • 下载

计算机等级考试二级C++上机模拟试题11套汇总及答案解释(一)

计算机等级考试二级C++模拟试题1上机部分   一、改错题 使用VC6打开考生文件夹下的工程kt6_1,此工程包含一个源程序文件kt6_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出...

2016级计算机C++助教工作(11) 第三次上机解题报告

A ants 只需要计算蚂蚁离两端远近关系, 最短时间是所有蚂蚁都快速到达端点的时间 最长时间是其中一只蚂蚁到端点的最长时间 #include #include #include using name...

计算机图形学上机实验之DDV算法

#include //实用工具包 #include #include #include #include #include #include #include struct GLintPoint{ ...

2016级计算机C++助教工作(12) 第二次上机解题报告

A.   Brainman 冒泡排序,平方的复杂度能过,循环N次,每次判断相邻两个数是否要交换,统计次数即可 #include #include #include using namespace st...

2016级计算机C++助教工作(7)第一次上机题

第五题: 注意输出的时候用 (int) pow(2,x) 强制转换输出为int,pow函数得到的结果为double类型数据。 采用贪心算法的同学注意一下以下样例: [[][[]][]]...

计算机等级考试二级C++上机模拟试题11套汇总及答案解释(三)

练习7 一、改错题   使用VC6打开考生文件夹下的工程kt12_1,此工程包含一个源程序文件kt12_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:   100 ...

2012北邮计算机考研复试上机题解

A:二叉排序树 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3803 解决:1526 题目描述:         二叉排序树,也称为二叉查找树。可以是一颗空树,也...
  • opm777
  • opm777
  • 2016年04月28日 11:14
  • 2454

西电计算机研究生复试上机题

如果有问题欢迎指出......本代码只在本地测试,无法提交OJ测试。难免会有问题。共同学习....... #include #include #include int cmp(const ...
  • SJF0115
  • SJF0115
  • 2013年03月29日 12:43
  • 2126
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算机复试上机C/C++算法积累
举报原因:
原因补充:

(最多只允许输入30个字)