我的cpp的算法学习笔记

来自大学课程的一封启示。

在专攻硬件这条路上算是越走越远了啊,硬件会不会要走得更远一点?因为要接触底层,那么更需要学会一些强类型的语言。C,我来了

纯属是个人笔记,想到多少写多少,各位看官勿怪。
写了一部分以后就没写了,东西很浅,就是入个门。

在一切的最初

pic
近距离神魔打架

言归正传

编写C++的一些IDE一般有 Dev-Cpp, CLion, Visual Studio

Microsoft Visual Studio 应该算是比较熟悉的了,当然不是 Visual Studio Code

小项目使用 Dev-Cpp
大项目使用 CLion

在学习一门语言的时候我们总是习惯去输出他。

pic
#include <iostream>
int main() {
 float a,b,c,d,e,f,g;
 scanf("%f %f %f %f %f %f %f", &a,&b,&c,&d,&e,&f,&g);
 printf("%.2f",(a+b+c+d+e+f+g)/7);
 return 0;
}

这其实就是一个简单的均值求法。

每一个语言都有它的魅力,比如C++,令人难以理解的运算速度是超越其他语言的绝对优势。

语言经典的循环

每一个语言必不可少的东西,进阶后就是迭代器,遍历的算法在大型项目中非常常见(结论来自我做过的其他项目)

for()

#include <iostream>
int main() {
 int a;
 scanf("%d", &a);
 for (int i = 0;i < 5;i++){
  printf("%d", a);
  if (i < 4) printf(" ");
  a = 2 * a + 1;
 }
 return 0;
}

求这个分数序列的前n项之和

题目:有一个分数序列 q1/p1,q2/p2,q3/p3,q4/p4,q5/p5,.... ,其中qi+1= qi+ pi, pi+1=qi, p1= 1, q1= 2。比如这个序列前6项分别是2/1,3/2,5/3,8/5,13/8,21/13。求这个分数序列的前n项之和。

样例输入
2
样例输出
3.5000

#include <stdio.h>
int main() {
 int n;
 float p[100], q[100], s = 0;
 scanf("%d", &n);
 for (int i = 0; i < n; i++) {
  p[i] = (i > 0) ? q[i - 1] : 1;
  q[i] = (i > 0) ? p[i - 1] + q[i - 1] : 2;
  s += q[i] / p[i];
 }
 printf("%.4f", s);
 return 0;
}

从键盘输入5个数,找出其最大数并输出

样例输入
2 3 4 7 5
样例输出
7

#include <stdio.h>
int max(int a, int b) {
 return  a > b ? a : b;
}

int main() {
 int m = 5, a[m], t = 0;
 scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]);
 for (int n = 0; n < m; n++) {
  t = max(a[n], t);
 }
 printf("%d", t);
 return 0;
}

求n的正整数的阶乘的和

样例输入
5
样例输出
153

#include <stdio.h>
int main() {
 long long int n, s = 0;
 scanf("%lld", &n);
 for (int i = 1; i <= n; i++) {
  int c = 1;
  for (int v = 1; v <= i; v++) {
   c *= v;
  }
  s += c;
 }
 printf("%lld", s);
 return 0;
}

绕啊绕绕啊绕绕啊绕

请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。
比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。

样例输入
2 22
样例输出
6

#include <stdio.h>
int count(int n) {
 int i;
 for (i = 0; n > 0; n /= 10)
 {
  if (n % 10 == 2) i++;
 }
 return i;
}

int main() {
 int a, b, c = 0;
 scanf("%d %d", &a, &b);
 for (int i = a; i <= b; i++)
 {
  c += count(i);
 }
 printf("%d", c);
 return 0;
}

你真的懂语法吗?

pic

do while()

根据条件来循环语句。
阶乘相加的算法。

// 题目:求1!+2!+3!+4!+…+n!的结果。n!=n*(n-1)*(n-2)*...2*1
#include <iostream>
int main() {
 int a;
 while(scanf("%d", &a) != EOF) {
  int d = 0;
  for (int b = 1; b <= a; b++) {
   int e = 1;
   for (int c = 1; c <= b; c++) {
    e *= c; 
   }
   d += e;
  }
  printf("%d\n", d);
 } 
 return 0;
}

库和包(我习惯的叫法)

OJ平台上并不允许引用其他的包,所以使用基础方法去解决一些问题的时候会很头疼(平常倒也不用那么死脑筋,有轮子不用是**,不过学习的时候就得好好学)

math.h stdio.h

在哪里?自动生成在程序目录里面吗?
其它库函数标准文件呢?
那为什么,生成目录没有这文件、、却可以运行?

不完全统计,C语言标准库中的头文件有15个之多,所以我主要介绍常用的这四个头文件stdio.h,string.h,math.h,stdlib.h。

他们都被存放于用户所带的C:\Program Files\Microsoft Visual Studio\VC98\Include

他们各个被定义的方法都不同,已经有很多教材对这些进行了整理。(那么这里就不多做赘述了)

scanf()有什么特点

如果要单独拿一个字符(数字)

#include <iostream>

int main() {
 int a, b;
 scanf("%1d%1d", &a, &b); // 38
 printf("%d和%d", a, b); // 3和8
 return 0;
}

函数

不同于数学中的函数的是,他将步骤进行分开,主要放大了其中的运行逻辑。

// 下面有所体现
#include <iostream>

void fn() {
 // 这里定义了一个 fn() 函数
 return;
}

int main() {
 fn(); // 这里调用了fn()
 return 0;
}

其中,能看出 void fn() “fn”是函数名, “void”是函数将要返回的类型。

int main(void) 是标准形式,这么写时,结尾要加 return 0; 其实怎么写都可以,主要是看你的编译器。(来自“百度”)