[人脑&电脑][通识课][算法][第一次作业]

算法设计题目要求

  • 问题框架描述:功能/输入/输出
  • 以表格形式给出测试样例及预期结果
  • 数据空间描述
  • 算法伪代码描述(或流程图)
  • 代码实现

第一题:数字统计

题目:输入若干非0实数,统计其中正数与负数的个数,遇到0时结束。

1、 问题框架描述:

  • 功能:统计一组数中的正数和负数个数
  • 输入:一组数
  • 输出:正数个数 负数个数

2、 以表格形式给出测试样例及预期结果

测试样例预期结果
-3 -4 -5 1 2 3 0 23 3
12 4 -6 0 1 2 32 1
4 d x 0 #输入不规范

3、数据空间描述:

  • 数据类型:整型变量
  • 变量名称:index,positive_number,negative_number
  • 存储空间大小:4 * 3 byte
  • 存储位置:栈
  • 含义: index表示当前操作数;positive_number表示正数个数;negative_number表示负数个数

4、算法伪代码描述(或流程图)

第一版伪代码
  1. 初始化变量
  2. 读入一个值
  3. 如果该值是一个非零数,进行判断和统计;重复2,3;
  4. 如果该值是零,结束程序;分别输出正数个数和负数个数
  5. 如果该值不是一个数字,输出相关提示;
第一次细化
  1. 设置一个变量index来接受当前数字,用两个变量positive_number和negative_number来做统计;
  2. 输入index
  3. 如果index大于0,positive_number+1;如果index小于0,negative_number+1。重复2,3步;
  4. 如果index等于0,输出positive_number和negative_number。
  5. 如果index不是数字,输出“输入不规范”,并结束程序;
第二次细化
1. int index = 0, positive_number = 0, negative_number = 0;
2. scanf("%d", &index); 
3. if (index > 0) positive_number++; else negative_number++; 
4. else if(index == 0) 
    printf("%d %d", positive_number, negative_number);
5. else printf("输入不规范");

5、代码实现:

#include<stdio.h>
int main()
{
	int index = 0, positive_number = 0, negative_number = 0;
	while(1)
	{

		if(scanf("%d",&index) != 0)
		{
			if(index == 0) break;
			else if(index > 0) positive_number++;
			else if(index < 0) negative_number++;
			
		}
		else 
		{
			printf("输入不规范\n");
			goto A; 
		}
		
	}
	printf("%d %d", positive_number, negative_number);
	A:return 0;
}

6、算法分析:

  • 空间复杂度O(1) 时间复杂度O(n)
  • 总结:该程序可以契合测试样例和期望结果,并且对于非法输入有所注意,可基本解决题目问题。
  • 改进方向:能否在输入不规范时,提示并且能够继续输入。

第二题:质数的判断

题目:如果整数只能被1和自身整除,那么这个整数就是质数。例如,2、3、5和7都是质数,但4、6、8和9却不是。写出判断一个数是否为质数的算法。

1、 问题框架描述:

  • 功能: 判断一个数是否是质数
  • 输入: 一个数
  • 输出: True / false

2、 以表格形式给出测试样例及预期结果

测试样例预期结果
2True
4False
9False

3、数据空间描述:

  • 数据类型:整型变量
  • 变量名称:index
  • 存储空间大小:4 byte
  • 存储位置:栈
  • 含义: 代表当前需要进行判断的数

4、算法伪代码描述(或流程图)

第一版伪代码
  1. 初始化变量
  2. 输入一个数
  3. 如果整数只能被1和自身整除,那么这个整数就是质数。
第一次细化
  1. 用index表示需要进行判断的数
  2. 输入index
  3. 列举从2开始到sqrt(n),如果存在一个数可以被index整除,输出True,否则输出False
第二次细化
1. int index, i, flag = 0;
2. scanf("%d", &index);
3. for(i = 2; i <= sqrt(index); i ++)
    {
        if (index % i == 0) flag = 1;
    }
    if(flag) printf("True");
    else printf("False");

5、代码实现:

#include <stdio.h>
#include <math.h>

int main()
{
	int index, i, flag = 0;
	scanf("%d", &index);
	for (i = 2; i <= sqrt(index); i ++)
	{
		if (index % i == 0) flag = 1;
	}
	if (flag) printf("True");
	else printf("False");
	return 0;
}

6、算法分析:

  • 空间复杂度O(1) 时间复杂度O(n)
  • 总结:该程序可以契合测试样例和期望结果,可基本解决题目问题。

斐氏数列的计算问题

题目:斐波那契数列是指后面的每个数据项都是前两项的和的数列,如0,1,1,2,3,5,8,13,21,…。写出能够计算第n个斐波那契数的算法

1、 问题框架描述:

  • 功能:计算第n个斐波那契数
  • 输入:n
  • 输出:res

2、 以表格形式给出测试样例及预期结果

测试样例预期结果
10
21
921

3、数据空间描述:

  • 数据类型:数组
  • 变量名称:int q[N]
  • 存储空间大小:4 * N byte
  • 存储位置:栈
  • 含义: 记录每一项对应的斐波那契数

4、算法伪代码描述(或流程图)

第一版伪代码
  1. 初始化变量
  2. 将每一项的斐波那契数储存到数组中
  3. 输入所求项
  4. 输出所求的斐波那契数
第一次细化
  1. 开辟数组
  2. 第1项是0,第2项是1,第3项是1,第n项是q[n - 1] + q[n - 2];实现数组填充
  3. 输入n
  4. 输出q[n]
第二次细化
1. int N = 1010;int q[N], i, n;
2. q[0] = 1 ; q[1] = 1; for (i = 2; i < N ; i ++) q[i] = q[i - 1] + q[i - 2];
3. scanf("%d", &n);
4. printf("%d", q[n - 1]);

5、代码实现:

#include <stdio.h>
int main()
{
	int N = 1010;
	int q[N], i, n;
	q[0] = 0;
	q[1] = 1;
	for (i = 2; i < N; i ++)
	{
		q[i] = q[i - 1] + q[i - 2];
	}
	scanf("%d", &n);
	printf("%d", q[n - 1]);
	return 0;
}

6、算法分析:

  • 空间复杂度O(n) 时间复杂度O(n)
  • 总结:该程序可以契合测试样例和期望结果,可基本解决题目问题。
  • 改进方向:能否不进行预先的数组填充,直接递归实现。

括号匹配问题

判断给定表达式中的括号是否匹配。表达式中的合法括号为“(”、“)”、“[”、“]”、“{”、“}”,这三种括号可以按照任意的次序嵌套使用。对每个表达式,若其中的括号是匹配的,则输出“yes”,否则输出“no”。

1、 问题框架描述:

  • 功能:判断表达式中的括号是否匹配
  • 输入:字符串
  • 输出:yes/ no

2、 以表格形式给出测试样例及预期结果

测试样例预期结果
[(d+f)*{}2]yes
[(2+3))no
()}no
[4(6]7)9no

3、数据空间描述:

  • 数据类型:字符串,栈
  • 变量名称:str
  • 存储位置:栈
  • 含义: 字符串来储存处理对象,栈来处理对象

4、算法伪代码描述(或流程图)

第一版伪代码
  1. 清除字符串中的非括号部分
  2. 分类左右括号
  3. 左括号入栈,右括号进行判断,注意边界条件
  4. 进行判断并输出
第一次细化
  1. 对于不是括号的内容进行跳过,使得字符串中保留括号部分
  2. 括号匹配函数(用来分类左右括号)
  3. 如果字符串长度为奇数,则no
  4. 如果栈中没有左括号,这时候来了一个右括号,则no
  5. 如果右括号不能与栈顶元素相匹配,则no
  6. 如果可以匹配,栈顶出栈
  7. 到最后如果栈不空,则no
第二次细化
1. //字符串清除处理
    for(j = k = 0;str[j]!='\0';j++)
		if(str[j]=='(' || str[j]==')' || str[j] == '[' || str[j] == ']' || str[j] == '{' || str[j] == '}')
			str[k++] = str[j];
            str[k] = '\0';
2. //括号匹配函数
    char pairs(char a)
 {
    if (a == '}') return '{';
    if (a == ']') return '[';
    if (a == ')') return '(';
    return 0;
}
3. if (n % 2 == 1) return 0;//长度判断
4. if (top == 0 || stk[top - 1] != ch) return 0;//栈顶没有括号,来一个右括号,或者右括号不能和栈顶的括号进行匹配
5. if (ch)//如果当时是右括号 
		{...}
         top--;// 栈顶可以和这个相匹配,就出栈 
6. return top == 0;//判断最后是不是空栈

5、代码实现:

#include <stdio.h>
#include <cstring>
char pairs(char a) {
    if (a == '}') return '{';
    if (a == ']') return '[';
    if (a == ')') return '(';
    return 0;
}

int isValid(char* s)
 {	
 
    int n = strlen(s);
    if (n % 2 == 1) {
        return 0;
    }
    int stk[n + 1], top = 0;
    for (int i = 0; i < n; i++) {
        char ch = pairs(s[i]);//[()] r如果是左括号返回0,如果是右括号,返回其对应的右括号 
        if (ch)//如果当时是右括号 
		{
            if (top == 0 || stk[top - 1] != ch) {
                return 0;//表示还有字符需要被匹配,但是栈空了
            }
            top--;// 栈顶可以和这个相匹配,就出栈 
        } else
		{
            stk[top++] = s[i];//如果是左括号,直接入栈 
        }
    }
    return top == 0;
}
int main()
{
    char str[100];
    scanf("%s", str);
    int j,k;
    //对栈中不是括号的元素进行清除
	for(j = k = 0;str[j]!='\0';j++)
		if(str[j]=='(' || str[j]==')' || str[j] == '[' || str[j] == ']' || str[j] == '{' || str[j] == '}')
			str[k++] = str[j];
	str[k] = '\0';

    if (isValid(str)) printf("yes");
    else printf("no");
    return 0;
}

6、算法分析:

  • 空间复杂度O(n) 时间复杂度O(n)
  • 总结:该程序可以契合测试样例和期望结果,可基本解决题目问题。
  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值