杨辉三角形

题目

问题描述

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。下面给出了杨辉三角形的前4行:

1

1 1

1 2 1

1 3 3 1

给出n,输出它的前n行。

输入格式

输入包含一个数n。

输出格式

输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格隔。请不要在前面输出多余的空格。

样例输入

4

样例输出

1

1 1

1 2 1

1 3 3 1

数据规模与约定

1 <= n <= 34。

分析

可以通过二维数组来解题。在实际编写代码时,我没有使用第零行和第零列,而题中声明了n小于等于34,所以max应设置为35,这样二维数组a才可能有第34行、第34列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>;
#define max 35//当max等于35时,a[34][34]才是能存在的。所以注意max的值应该等于题中的最大值加一
int main()
{
int n;
int a[max][max];
int i, j;

scanf("%d", &amp;n);

for(i = 1;i &lt;= n;i ++){
for(j = 1;j &lt;= i;j ++){
a[i][j] = 1;
}
}

for(i = 3;i &lt;= n;i ++){
for(j = 2;j &lt;= i-1;j ++){
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}

for(i = 1;i &lt;= n;i ++){
for(j = 1;j &lt;= i;j ++){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}

核桃的数量

题目

问题描述

小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:

  1. 各组的核桃数量必须相同
  2. 各组内必须能平分核桃(当然是不能打碎的)
  3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)

输入格式

输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c<30)

输出格式

输出一个正整数,表示每袋核桃的数量。

样例输入1

2 4 5

样例输出1

20

样例输入2

3 1 1

样例输出2

3

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>;

int GCD(int a, int b)
{
int t;
while(b != 0){
t = a % b;
a = b;
b = t;
}
return a;
}

int LCM(int a, int b)
{
return (a*b)/GCD(a,b);
}

int main()
{
int a, b, c;
int N;
scanf("%d %d %d", &amp;a, &amp;b, &amp;c);
N = LCM(LCM(a, b), c);
printf("%d", N);
return 0;
}

当时做题时,看到“各组的核桃数量必须相同”时,我以为题目意思是“输出结果必须能被3整除”。其实题目中要求的输出是“每袋核桃的数量”,也就是说第一个要求已经满足了,只要考虑第二个要求即可

由题知,只需求三个组正在加班的人数的最小公倍数即可,而求两个数的最小公倍数可以用辗转相除法,求三个数时只需连用两次辗转相除法即可,即:先对ab求最小公倍数得ans,再对ansc求最小公倍数得到最终结果。代码表示为:N = LCM(LCM(a, b), c);

求辗转相除法的函数其实还可以写得再简洁些,比如这样:

1
2
3
4
int GCD(int a,int b)
{
return b == 0 ? a : gcd(b ,a%b);
}

C语言中的预编译处理命令与头文件

预编译处理命令

以#开头,不用分号结尾,用于声明所引用的头文件。预编译处理命令不属于C语言的语句

#include<stdio.h>//一般用包含系统文件,使用这个声明后,将先从系统目录开始查找相应的头文件。

#include “stdio.h”//一般用包含项目文件,使用这个声明后,将先从项目目录开始查找相应的头文件。

头文件

以“.h”为后缀的文件。

stdio头文件

stdio.h是C编译系统提供的一个文件名,stdio是“standard input & output”的缩写,即有关标准输入输出的信息。

所包含的函数:printf()、scanf()等

stdlib头文件

即standard library标准库头文件。包含了C、C++语言中最常用的系统函数。stdlib.h里面定义了五种类型、一些宏和通用工具函数。

所包含的函数:

malloc()

函数原型: void * malloc(unsigned size);
函数功能: 分配size字节的存储区
返回值: 所分配的内存区地址。如果内存不够分配未成功,返回0。由于返回的指针是void * 类型,而这块内存空间将储存的数据类型可能是int、char,所以常常需要进行强制类型转换,如int * p = (int *)malloc(sizeof(int));

calloc()

函数原型:void * calloc(unsigned n,unsign size);
函数功能:分配n个数据项的内存连续空间,每个数据项的大小为size
返回值:分配内存单元的起始地址。如果内存分配不成功,返回0

realloc()

函数原型: void * realloc(void * p,unsigned size);
函数功能: 将p指向的已分配内存区的大小改为size。size可以比原来分配的空间大或小
返回值: 返回指向该内存区的指针。若分配失败则返回NULL。

free()

函数原型: void free(void* p);
函数功能: 释放p所指的内存区。

system()

这个函数比较特殊,后面会专门写一篇博客详解,这里先不铺展开~

rand()

函数原型: int rand(void);
函数功能: 产生0到32767间(即0到0x7fff之间)的随机整数

exit()

函数原型: void exit(int state)
函数功能: 程序中止执行,返回调用过程
返回值:若返回0,表示正常中止;若返回的值非0,表示非正常中止。

labs()

函数名称: labs
函数原型: long labs(long num)
返回值: 长整型参数的绝对值

io头文件

write()

函数原型:int write(int handle,char *buf,unsigned len)
函数功能:写文件函数。将缓冲区的数据写入与handle相联的文件或设备中。其中handle是文件句柄,buf是缓冲区地址,len是缓冲区字节长度
返回值:实际写入的字节数(不包括回车符)。若出错,则返回-1。

read()

函数原型:int read(int handle,void *buf,unsigned len)
函数功能:读文件函数 。从与handle相联的文件中读取len字节的数据到由buf所指的缓冲区中。
返回值:读入缓冲区的字节数。

open()

函数原型:int open(const char *path,int access[,unsigned mode])
函数功能:打开文件进行读写的函数。打开path指定的文件,根据access指定的模式值读写。
返回值:成功时,文件指针指向文件头。

close()

函数原型:int close(int handle)
函数功能:关闭文件函数。关闭由文件句柄所指向的文件。
返回值:0(成功);-1(失败)

math头文件

math.h头文件定义了各种数学函数和一个宏。这个库中所有函数所需的传入参数都是double类型,并且返回值值也为double类型。

sin(a)

返回值:a是弧度值

abs(b):

返回值:b的绝对值

exp(c)

返回值:返回e的x次方

log()

函数原型:double log(double x)
返回值: 返回参数x的自然对数值,即以e为底的x的对数值。

log10()

函数原型:double log10(double x)
返回值: 返回以10为底的x的对数值。

pow()

函数原型:double pow(double x, double y)
返回值: 返回x的y次方计算结果。

sqrt()

函数原型:double sqrt(double x)
返回值: 返回参数x(x>0)的平方根值。

ceil()

函数原型:double ceil(double x)
返回值:返回大于或等于x的最小整数值。

floor()

函数原型:double floor(double x)
返回值:返回小于或等于x的最大整数值。

time头文件

time.h是C/C++中有关日期和时间的头文件。
time_t:表示从标准计时点(1970-01-01 00:00:00)到当前时间的秒数。类型是long
clock_t: 表示从程序启动到此次函数调用时累计的毫秒数。用于程序计时。
struct tm:通常用于存储本地时。

time

获取当前系统时间(UTC时间)的time_t值。

difftime

函数原型:得到两个日历时之间的差值。

clock

函数原型: clock_t clcok()
函数功能: 获取程序开始执行后占用的处理器时间
返回值:clock_t

localtime

函数原型: struct tm * localtime(const time_t *timer)
函数功能: 返回一个以tm结构表达的机器时间信息
返回值: 以tm结构表达的时间,结构tm定义如下:

火狐浏览器快捷键

使用火狐浏览器时,记住几个常用的快捷键,对于浏览效率的提升挺大的

实际上,这些快捷键在大部分浏览器间是通用的,所以自然掌握的越多也就越好

查找类

页面查找:Ctrl+F
查看上一个查找结果: F3
查看下一个查找结果: Shift+F3
网页搜索: Ctrl+E //即把光标移动到地址栏以使用搜索引擎进行搜索

浏览类

放大文字: Ctrl++
缩小文字: Ctrl+-
恢复文本大小: Ctrl+0
打开书签: Ctrl+B //可以把B看成bookmark(n.书签)的缩写

标签页

新建标签页: Ctrl+T
关闭标签页: Ctrl+W
下一个标签页: Ctrl+Tab
前一个标签页: Ctrl+Shift+Tab

窗口

新建窗口: Ctrl+N
关闭窗口: Ctrl+Shift+W

开发类

查看页面源代码: Ctrl+U
查看页面元素:Ctrl+Shift+C//可以通过查看元素来提取网页素材

C++中的布尔类型变量

  1. bool类型包含在stdio.h头文件里

  2. bool类型的变量一般占1个字节,因为其值只能为0或1,一个字节正好可以表示两种状态

    1
    2
    cout << sizeof(a) << sizeof(b) << endl;//一般输出为1 1
    cout << sizeof(int) << endl;//一般输出为4
  3. 布尔类型变量的值只能是0或1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool a = true;//true和false是预定义常量,值分别为1和0 
    bool b = false;
    cout << a << " " << b << endl;//输出为1 0
    a = 8;
    b = 9;
    cout << a << " " << b << endl;//输出为1 1
    a = 0;
    b = 0;
    cout << a << " " << b << endl;//输出为0 0
  4. 布尔型变量可以看成为整型变量的子集,常常可以用来充当表示状态的tag
    比如以前为了定义一个表示状态的变量,我们可能这样写:int tag = 0;
    有了布尔型变量,我们就可以这样写了:bool tag = 1;
    这样代码思路看起来更加清晰了

  5. 功能为判断的函数,其类型可以设为bool型。注意bool型函数的返回值应当是bool型变量,而bool型变量只能是0或1,即函数返回值只会是0或1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <cstdio.h>;//bool类型包含在cstdio.h头文件(C++)或stdio.h头文件(C)里
    #include <iostream>
    using namespace std;
    bool judge(int i)
    {
    switch(i)
    {
    case 1 : return true;//即便将此处的true改为1000,下面的输出也是1
    case 2 : return false;
    default : return true;
    }
    }
    int main()
    {
    cout << judge(1) << endl;//输出1
    }