[关闭]
@orangelee-666 2019-12-15T12:03:35.000000Z 字数 8180 阅读 366

正式竞赛笔记


strcmp:C++自带函数---字典序

strcpy:交换顺序


getline:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string name;
  7. string city;
  8. cout << "Please enter your name: ";
  9. cin >> name;
  10. cout << "Enter the city you live in: ";
  11. cin >> city;
  12. cout << "Hello, " << name << endl;
  13. cout << "You live in " << city << endl;
  14. return 0;
  15. }

而结果呢,是这样的

Please enter your name: John Doe
Enter the city you live in: Hello, John
You live in Doe

所以说虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题:当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取

而在这个示例中,用户根本没有机会输入 city 城市名。因为在第一个输入语句中,当 cin 读取到 John 和 Doe 之间的空格时,它就会停止阅读,只存储John作为name的值。在第二个输入语句中,cin使用键盘缓冲区中找到的剩余字符,并存储 Doe 作为 city 的值。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string name;
  7. string city;
  8. cout << "Please enter your name: ";
  9. getline(cin, name);
  10. cout << "Enter the city you live in: ";
  11. getline(cin, city);
  12. cout << "Hello, " << name << endl;
  13. cout << "You live in " << city << endl;
  14. return 0;
  15. }

输出结果

Please enter your name: John Doe
Enter the city you live in: Chicago
Hello, John Doe
You live in Chicago


刘子闻(神!)讲的高精度【太强了】\

1.6 10:大整数加法

总时间限制: 1000ms 内存限制: 65536kB

描述

求两个不超过200位的非负整数的和。

输入

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

22222222222222222222
33333333333333333333

样例输出

55555555555555555555

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. int main()
  5. {
  6. char a[205]={0},b[205]={0};
  7. int d[205]={0},f[205]={0},e[205]={0},c,l=0;
  8. int l1,l2;
  9. gets(a);
  10. gets(b);
  11. l1=strlen(a);
  12. l2=strlen(b);
  13. for(c=0;c<l1;c++)
  14. {
  15. d[205-l1+c]=a[c]-'0';
  16. }
  17. for(c=0;c<l2;c++)
  18. {
  19. f[205-l2+c]=b[c]-'0';
  20. }
  21. c=205;
  22. while(c--)
  23. {
  24. e[c]+=d[c]+f[c];
  25. if(e[c]>=10)
  26. {
  27. e[c-1]++;
  28. e[c]=e[c]%10;
  29. }
  30. }
  31. for(c=0;c<205;c++)
  32. {
  33. if(e[c]!=0)
  34. break;
  35. }
  36. for( c;c<205;c++)
  37. l+=printf("%d",e[c]);
  38. if(l==0)
  39. printf("0");
  40. return 0;
  41. }

1.6 11:大整数减法

总时间限制: 1000ms 内存限制: 65536kB

描述

求两个大的正整数相减的差。

输入

共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。

输出

一行,即所求的差。

样例输入

9999999999999999999999999999999999999
9999999999999

样例输出

9999999999999999999999990000000000000

  1. #include<cstdio>
  2. #include<cstring>
  3. #define m 220
  4. int x[m],y[m];
  5. char b[m],c[m];
  6. int i,s,r,t,z;
  7. int main()
  8. {
  9. scanf("%s%s",b,c);
  10. s=strlen(b);
  11. r=strlen(c);
  12. if(s>r) t=s;
  13. else t=r;
  14. for(int i=0;i<s;i++) x[i]=b[s-i-1]-'0';
  15. for(int i=0;i<r;i++) y[i]=c[r-i-1]-'0';
  16. for(int i=0;i<t;i++)
  17. {
  18. x[i]-=y[i];
  19. if(x[i]<0)
  20. {
  21. x[i+1]--;
  22. x[i]+=10;
  23. }
  24. }
  25. int z=t;
  26. while(x[z]==0&&z!=0)
  27. {
  28. z--;
  29. }
  30. for(int i=z;i>=0;i--)
  31. {
  32. printf("%d",x[i]);
  33. }
  34. return 0;
  35. }

1.13 09:大整数乘法

总时间限制: 1000ms 内存限制: 65536kB

描述

求两个不超过200位的非负整数的积。

输入

有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

输出

一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

12345678900
98765432100

样例输出

1219326311126352690000

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #define m 500
  5. using namespace std;
  6. int x[m],y[m], z[m];
  7. char b[m],c[m];
  8. int main()
  9. {
  10. int len1, len2, len3;
  11. scanf("%s%s", b, c);
  12. len1=strlen(b);
  13. len2=strlen(c);
  14. for(int i=0; i<len1; i++)
  15. x[i] = b[len1-1-i]-'0';
  16. for(int i=0; i<len2; i++)
  17. y[i] = c[len2-1-i]-'0';
  18. for(int i=0; i<len1; i++)
  19. {
  20. for(int j=0; j<len2; j++)
  21. z[i+j]+=x[i]*y[j];
  22. len3 = len1+len2;
  23. }
  24. for(int i=0; i<=len3; i++)
  25. {
  26. if(z[i]>=10)
  27. {
  28. z[i+1]+=z[i]/10;
  29. z[i]%=10;
  30. }
  31. }
  32. while(z[len3-1]==0 && len3>1) len3--;
  33. for(int i=len3-1; i>=0; i--)
  34. {
  35. printf("%d", z[i]);
  36. }
  37. return 0;
  38. }

洛谷 P1480 A/B Problem(高精除以低精)

题目描述

输入两个整数a,b,输出它们的商(a<=10^5000,b<=10^9)

输入格式

两行,第一行是被除数,第二行是除数。

输出格式

一行,商的整数部分

输入样例

10
2

输出样例

5

  1. #include<cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. int a[10000];
  5. int y;
  6. int l=0;
  7. int yushu;
  8. int shang;
  9. int f=0;
  10. int main()
  11. {
  12. char c=getchar();
  13. while (c>='0' && c<='9')
  14. {
  15. l++;
  16. a[l]=(c-'0');
  17. c=getchar();
  18. }
  19. //scanf("%s",a);
  20. //l=strlen(a);
  21. scanf("%d",&y);
  22. for (int i=1;i<=l;i++)
  23. {
  24. yushu=a[i]%y;//第i位的余数
  25. shang=a[i]/y;//第i位的商
  26. a[i]=shang;
  27. a[i+1]+=yushu*10;//把余数弄到下一位
  28. }
  29. for (int i=1;i<=l;i++)
  30. {
  31. if (f==0 && a[i]>0) f=1;
  32. if (f==1) printf("%d",a[i]);
  33. }
  34. return 0;
  35. }

洛谷 P1706 全排列问题

题目描述

输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

n(1≤n≤9)

输出格式

由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个场宽。

输入输出样例

输入

3

输出

1    2    3
1    3    2
2    1    3
2    3    1
3    1    2
3    2    1
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. int n, m=0;
  6. int a[10];
  7. bool vis[25];
  8. void q()
  9. {
  10. if(m==n)
  11. {
  12. for(int i=0; i<n; i++) printf("%5d", a[i]);
  13. printf("\n");
  14. }
  15. for(int i=1; i<=n; i++)
  16. {
  17. if(vis[i]==0)
  18. {
  19. vis[i]=1;
  20. a[m++]=i;
  21. q();
  22. m--;
  23. vis[i]=0;
  24. }
  25. }
  26. }
  27. int main()
  28. {
  29. scanf("%d", &n);
  30. q();
  31. return 0;
  32. }

时间复杂度

先来一段有趣的对话

1
2
3
4
5

看到时间复杂度的重要性了吧

那什么是时间复杂度呢

7

一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是......

8
9

由此可见,衡量代码的好坏,包括两个非常重要的指标:

10

我们先看一下标准的定义

定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。

当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。

我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。

此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。

如何计算时间复杂度

  1. for(i=0;i<n;i++)
  2. {
  3. for(j=0;j<i;j++)
  4. {
  5. for(k=0;k<j;k++)
  6. x=x+2;
  7. }
  8. }

那我们可以看到,代码中出现了三层循环,那么我们可以认为它的时间复杂度为

当i=m,j=k的时候,内层循环的次数为k

当i=m时,j可以取

所以这里最内循环共进行了

所以,i从0取到n, 则循环共进行了:

所以时间复杂度为

  1. for (i=1;i<n;i++) {
  2. y=y+1;
  3. for(j=0;j<=(2*n);j++) {
  4. x++; }
  5. }

像这样,代码中语句①的频度是

语句②的频度是

(f(n)上面提到了)

该程序的时间复杂度

  1. i=1;
  2. while (i<=n)
  3. i=i*2;

语句①的频度是1

到这里,又卡住了,语句②是什么鬼。。。(我也不知道)

那我们可以设语句②的频度是, 则:

取最大值

一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数,因此,算法的时间复杂度记做:。随着模块n的增大,算法执行的时间的增长率和的增长率成正比,所以越小,算法的时间复杂度越低,算法的效率越高。

在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出的同数量级(它的同数量级有以下:),找出后,,若求极限可得到一常数c,则时间复杂度

C++ cmath库中的函数

今天模拟,想调用<cmath>中的函数,然鹅。。。突然忘了,所以还是总结一下吧
写法 作用
int abs(int i) 返回整型参数i的绝对值
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
double exp(double x) 返回指数函数e^x的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回x^y的值
double pow10(int p) 返回10^p的值
double sqrt(double x) 返回+√x的值
double acos(double x) 返回x的反余弦arccos(x)值,x为弧度
double asin(double x) 返回x的反正弦arcsin(x)值,x为弧度
double atan(double x) 返回x的反正切arctan(x)值,x为弧度
double cos(double x) 返回x的余弦cos(x)值,x为弧度
double sin(double x) 返回x的正弦sin(x)值,x为弧度
double tan(double x) 返回x的正切tan(x)值,x为弧度
double hypot(double x,double y) 返回直角三角形斜边的长度(z),x和y为直角边的长度,z^2=x^2+y^2
double ceil(double x) 返回不小于x的最小整数
double floor(double x) 返回不大于x的最大整数
int rand() 产生一个随机数并返回这个数
double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数
double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数
double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0
int atoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0
long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注