Jasin Yip

分类 C/C++ 下的文章

计蒜客【挑战难题】系列讲解(六)泥塑课

题目

第6题:泥塑课

  小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过250立方厘米的等量橡皮泥,教大家做泥塑。在上课过程中,她发现每个班都恰好有一个小朋友会去抢另一个小朋友的橡皮泥,于是她决定,在正式开始做泥塑前,让大家把手里的橡皮泥都捏成一个立方体,并且测量手里捏好的橡皮泥的长、宽和高。这样,她就可以知道谁被谁抢了橡皮泥了。
  小米老师在不同的学期可能会带一个班或者同时带多个班,因此输入数据可能有一组或者多组。每组输入数据的第一行为一个整数n,表示了这个班的小朋友数,之后n行每行包括了由空格分隔的三个整数和一个字符串,那个字符串表示了小朋友的名字,前面三个整数则是这个学术手里橡皮泥块的长、宽、高数据。按照幼儿园的规定,每个班最多有9个小朋友,最少也要有2个小朋友,每个小朋友在学籍系统中的名称不超过8个字符长。当出现一个班级的小朋友数为-1时,表示没有更多的班级了。
输出行数与小米老师带的班级数相同,形式为“X took clay from Y.”,具体请参考样例输出。

- 阅读剩余部分 -

计蒜客【挑战难题】系列讲解(五)矩阵翻转

题目

第5题:矩阵翻转

  晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
  输入第一行包括由空格分开的整数M、N、T(0<M<200,0<N<200,T=0或1),其中M和N分别表示待处理矩阵的行数与列数,T为0时表示左右翻转,为1时表示上下翻转。
  之后的M行,每行包括由空格分隔的N个整数,依次为输入矩阵的每一行的数据。
  输出包括M行N列,每个数字之间用一个空格分隔,每一行行末均有一个空格,表示的是按照要求翻转后的矩阵。

- 阅读剩余部分 -

在VS2013里使用scanf()报错的解决方法

错误提示信息

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

解决方案

在代码第一行添加以下代码:

#pragma warning(disable:4996)  

如何查询C语言中各整数类型的范围

准备工作

我们需要引入<limits.h>,其中

SHRT_MAX :short的最大值 
INT_MAX  :int的最大值   
LONG_MAX :long的最大值  

只要将它们用printf()打印出来就好了。

示例

#include <stdio.h>  
#include <limits.h>  
int main()  
{  
  printf("max short int is: %d\n", SHRT_MAX);  
  printf("max int is: %d\n", INT_MAX);  
  printf("max long int is: %d\n", LONG_MAX);  
  return 0;  
}  

以下转自百度百科:

要判断某种特定类型可以容纳的最大值或最小值,一种简便的方法是使用ANSI标准头文件limits.h中的预定义值。该文件包含一些很有用的常量,它们定义了各种类型所能容纳的值,下表列出了这些常量:
常 量 描 述

CHAR_BIT      >      char的二进制位数(bit)
CHAR_MAX      >      char的有符号整数最大值
CHAR_MIN      >      char的有符号整数最小值
MB_LEN_MAX    >      多字节字符的最大字节(byte)数
INT_MAX       >      int的有符号最大值
INT_MIN       >      int的有符号最小值
LONG_MAX      >      long的十进制最大值
LONG_MIN      >      long的十进制最小值
SCHAR_MAX     >      signedchar的十进制整数最大值
SCHAR_MIN     >      signedchar的十进制整数最小值
SHRT_MIN      >      short的十进制最小值
SHRT_MAX      >      short的十进制最大值
UCHAR_MAX     >      unsignedchar的十进制整数最大值
UINT_MAX      >      unsignedint的十进制最大值
ULONG_MAX     >      unsignedlongint的十进制最大值
USHRT_MAX     >      unsignedshortint的十进制最大值

对于整数类型,在使用2的补码运算的机器(你将使用的机器几乎都属此类)上,一个有符号类型可以容纳的数字范围为[- 2^(位数-1) ]到[+ 2^(位数 -1)-1],一个无符号类型可以容纳的数字范围为0到(+ 2^位数 )。
例如,一个16位有符号整数可以容纳的数字范围为-2^15(即-32768)到(+2^15-1)(即+32767)。而16为无符号整数可容纳的最大值为(2^位数-1)或表示为汇编形式0xffff。

计蒜客【挑战难题】系列讲解(四)简单斐波那契

题目

第4题:简单斐波那契

  斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加。
  用数学公式定义斐波那契数列则可以看成如下形式:
F0=0
F1=1
Fn=Fn-1+Fn-2
  我们约定Fn表示斐波那契数列的第n项,你能知道斐波那契数量中的任何一项吗?
  输入包括一行,包括一个数字N(0≤N≤50)。
  输出包括一行,包括一个数字,为斐波那契数列的第N项的值。

样例输入

7

样例输出

13

C 实现

#include <stdio.h>  
  
int fib(int N){  
    int i;  
    int arr[50] = {0};  //由于题目说明N的取值范围是(0≤N≤50),故定义数组为50  
      
    arr[1] = 1;   
    for (i = 2; i <= N; i++)  
        arr[i] = arr[i-1] + arr[i-2];  
  
    return arr[N];  //返回结果  
}  
  
int main(){  
    int N = 0;  
    scanf("%d", &N);  
    printf("%d", fib(N));   //输出结果直接调用函数计算  
      
    return 0;  
}  

它如何工作

  这题实际上只是考验对循环的运用,这里我使用了函数去计算结果。

  首先,根据定义,先把arr[

小贴士

  函数的概念其实很简单,我把它比喻为一台计算器,给计算器两个数字,并且加上一个运算符,它就给我返回一个结果。
  这就是函数的概念,调用函数时,只需要明白该函数有什么用。
  像题中的函数,作用就是:我给你N,你返回斐波那契数列的第N项的值给我。
  详细对于函数的学习,请移步至计蒜客C语言基础第35课:什么是函数

  实际上,斐波那契数列是经典的递归题,但我觉得很多时候不一定只靠递归才能解决问题,循环有时也挺方便的。