您的位置:首页 > 其它

做题小常识

2016-01-31 17:31 393 查看
1换行和回车的区别

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回车 >”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开 的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。


2数组最大长度

因为数组用的栈内存,系统默认最大1MB,以int a[]型数组为例,一个int占4字节,所以最大长度为:1024*1024/4=262144。

3判断一个数k是不是素数

只需用该数k除以2到根号下k,看能不能被整除

4知道三边计算该三角形面积(海伦-秦九韶公式 )

double s1=3,s2=4,s3=5;
double s=(s1+s2+s3)/2;
double area=srqt(s*(s-s1)*(s-s2)*(s-s3));


5 sort自定义排序函数

1)结构体数组排序

2)vector排序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool comp(const int &a,const int &b)
{
return a>b;
}
int main()
{
vector<int>v;
v.push_back(13);
v.push_back(23);
v.push_back(03);
v.push_back(233);
v.push_back(113);
sort(v.begin(),v.end(),comp);
int i=0;
for(i=0;i<5;i++)
{
cout<<v[i]<<endl;
}
system("pause");
return 0;
}


6 double 类型的数值比较

double m,double n;

if((m-n)<0.0001)

cout<<"此时m与n可以认为是相等的,因为double类型的数据存储都不精确,哪怕double=1.2,存进去可能是1.199999"<<endl;

7关于sin()/tan()等三角函数以及π的表示

三角函数可以直接在math.h中用,但参数是弧度而非角度,因此sin(30°)在C++里要转为sin(30*M_PI/180),使参数成为弧度即可,得出答案0.5。(M_PI可以直接用,相当于pi)。

8 int, long int, long long int 范围和大小

1)范围

unsigned int 0~4294967295

int -2147483648~2147483647

unsigned long 0~4294967295

long -2147483648~2147483647

unsigned long long:0~18446744073709551615

long long :-9223372036854775808~9223372036854775807

unsigned __int64的最大值:18446744073709551615

__int64:-9223372036854775808~9223372036854775807

2)大小
int 4个字节,long int 4个字节,long long int 8个字节;float 4个字节;double 8个字节;

(所以一个整型数组最长可以存264144个,因为一个数组所栈占空间为1Mb,一个int型占4字节,这样最大可以申请1024*1024/4=264144个)

short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节


9 Time Limit Exceeded

数组开小了或者其他数据结构开小导致溢出,算法复杂度过高,没有加读取EOF结束的语句,循环或递归的出循环的条件出问题从而一直在里面循环不能出来。

10 codeblocks ubuntu下调试

在Debug下,开始调试并跳到断点是F8,单步调试按F7,F5设置断点,degub-debuggingwindows-watches可以监视变量值的变化

在codeblock输入数据的命令框中,ctrl+shift+c是复制,ctrl+shift+v是粘贴,ctrl+d是相当于输入文件结束符EOF(windows下是ctrl+z)

11 memset();

memset(数组名,值,sizeof(数组名));//只要值是常量(即const或者#define定义的)或者是0即可。

memset(二维数组,值,sizeof(数组名));//二维数组直接如此赋值,是可以的

12 codeblock在自己写的函数里没有了字符补全提示

1)鼠标右键Format-use Astyle

2)编译运行一下,成功编译以后,再写就有了提示

13

struct构造函数

举例如下:

#include <iostream>
using namespace std;
struct node{
    int num;
    int time;
    node(int n,int t){num=n;time=t;}
};
int main(){
    node cur(12,13);
    cout<<cur.num<<cur.time<<endl;
}


14

利用位运算替换幂运算(速度更快)

左移运算符,在没有溢出的情况下,对于正数和负数, g左移j位是乘以2的j次方 , k+( g<<j ) == k +(g× ( 2 ^ j) )

右移运算符, g右移j位相当于除以2的j次方, k+(g>>j) == k + ( g / ( 2 ^ j) )

int g=2<<3;//(2 × (2^3) )==16
cout<<g<<endl;

int k=2>>1;//(2/ (2^1) )==1
cout<<k<<endl;


15

string char[]一维 char[][]二维 的scanf、printf、以及如何输出实际长度的比较

对于string

string g;
    g.resize(100);
    scanf("%s",&g[0]);
    printf("%s\n",&g[0]);
    //int len1=strlen(g); 这样是报错的
    int len2=g.size();
    int len3=g.length();
    cout<<len2<<endl;
    cout<<len3<<endl;
对于char a[]一维,char b[][]二维整理如下:

char b[101][101];
scanf("%s",&b[0]);
printf("%s",&b[0]);
cout<<strlen(b[0])<<endl;//输出第一行的实际长度
cout<<sizeof(b)<<endl;//101 * 101 ==总长度
//cout<<b[0].length()<<endl; 报错
//cout<<b.length()<<endl; 报错
//cout<<b[0].size()<<endl;报错
//cout<<b.size()<<endl; 报错


char a[10010];
scanf("%s",&a[0]);
printf("%s",&a[0]);
cout<<strlen(a)<<endl;//实际长度
cout<<sizeof(a)<<endl;//是可用长度,即之前定义的a[10010]所以是10010
//cout<<a.length()<<endl; 报错
//cout<<a.size()<<endl; 报错


16

sort对于二维数组并不好用!包括对于二维字符数组。解决办法,将二维字符数组放入结构体数组中,每个结构体再定义一个一维字符数组。

17

加typedef,之后的代码中关于phone[i]都会报错,是因为此时的phone成了struct Phone 的别名。得在结构体之后,重新phone phone111[10010],然后用phone111[i]是可以的。

typedef struct Phone{
char number[12];
int len;
}phone[10010];
......
<pre name="code" class="cpp"> scanf("%s",phone[i].number);



18结构体内重载运算符

struct person
{
float height,weight;
bool operator < (const person &p) const//最外层的const一定要加
{
return this->height<p.height;//或者 <span style="font-family: Arial, Helvetica, sans-serif;">return height<p.height;</span>
}
}people[maxn];


19 char* 与string 的互相转换

①:string 转为 char []

string a;
const char *temp=a.c_str();//都可以
const char *temp2=a.date();//都可以
②:char[] 转为 string

char b[10]="aaa";
char *a=b;
//cin>>a;char*是字符串指针,只能存储字符串指针变量,所以不能直接 char *a; cin>>*a;
cout<<b<<endl;
string temp=a;
cout<<temp<<endl;


20 关于IDE使用

在CodeBlocks中遇到file类不常见的错误,但是代码似乎又没错,那么关掉CodeBlocks(注意在任务管理器中查看是否还有进程没有关掉),重新打开并建立新的项目试试看。

21 如何扩大 栈(—stack) /(堆栈段—递归) 内存(防止栈溢出)

默认,递归10^4层。

#include <iostream>
#include <stdlib.h>
using namespace std;
long long int F(long long int i){
i++;
if(i==40000)//6.9*(10^5)
return i;
else
F(i);
}
int main()
{
cout<<F(1)<<endl;
}


① C++提交下,在头文件处写入:

<span style="font-family: Arial, Helvetica, sans-serif;"></span>
#pragma comment(linker, "/STACK:102400000,102400000")


②G++提交下,在main函数内最前方写入:

int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
检测递归:可递归6*(10^5)。 一般对C/C++,题目要求内存32768K==32MB,但是还有其他变量或数据占用内存,所应该递归层数远远小于6*(10^5)。

#include <iostream>
#include <stdlib.h>
using namespace std;
long long int F(long long int i){
i++;
if(i==600000)//6*(10^5)
return i;
else
F(i);
}
int main()
{
int size = 32 << 20; // 32MB==32*1024*1024
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));

cout<<F(1)<<endl;
}


22 常用数的计算:(一般要求程序的耗费时间的规模在10^6到10^7左右)

O(log 2 (n))时间复杂度(如二分法、二叉树等):(计算机中log若不加下标默认以2为底,所以一般看到的 log 2 (n) 即 log n)

log 2 (10^9) ≈ 29.9

log 2 (10^8) ≈ 26.6

log 2 (10^7) ≈ 23.2

log 2 (10^6) ≈ 19.9

log 2 (10^5) ≈ 16.6

log 2 (10^4) ≈ 13.3

log 2 (10^3) ≈10.0

log 2 (10^2) ≈ 6.6

log 2 (10^1) ≈ 3.3

23 关于排列组合公式

排列:




组合:

;C(n,m)=C(n,n-m)。(n≥m)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: