算法设计题目要求
问题框架描述:功能/输入/输出 以表格形式给出测试样例及预期结果 数据空间描述 算法伪代码描述(或流程图) 代码实现
第一题:数字统计
题目:输入若干非0实数,统计其中正数与负数的个数,遇到0时结束。
1、 问题框架描述:
功能:统计一组数中的正数和负数个数 输入:一组数 输出:正数个数 负数个数
2、 以表格形式给出测试样例及预期结果
测试样例 预期结果 -3 -4 -5 1 2 3 0 2 3 3 12 4 -6 0 1 2 3 2 1 4 d x 0 # 输入不规范
3、数据空间描述:
数据类型:整型变量 变量名称:index,positive_number,negative_number 存储空间大小:4 * 3 byte 存储位置:栈 含义: index表示当前操作数;positive_number表示正数个数;negative_number表示负数个数
4、算法伪代码描述(或流程图)
第一版伪代码
初始化变量 读入一个值 如果该值是一个非零数,进行判断和统计;重复2,3; 如果该值是零,结束程序;分别输出正数个数和负数个数 如果该值不是一个数字,输出相关提示;
第一次细化
设置一个变量index来接受当前数字,用两个变量positive_number和negative_number来做统计; 输入index 如果index大于0,positive_number+1;如果index小于0,negative_number+1。重复2,3步; 如果index等于0,输出positive_number和negative_number。 如果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、 以表格形式给出测试样例及预期结果
测试样例 预期结果 2 True 4 False 9 False
3、数据空间描述:
数据类型:整型变量 变量名称:index 存储空间大小:4 byte 存储位置:栈 含义: 代表当前需要进行判断的数
4、算法伪代码描述(或流程图)
第一版伪代码
初始化变量 输入一个数 如果整数只能被1和自身整除,那么这个整数就是质数。
第一次细化
用index表示需要进行判断的数 输入index 列举从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、 问题框架描述:
2、 以表格形式给出测试样例及预期结果
3、数据空间描述:
数据类型:数组 变量名称:int q[N] 存储空间大小:4 * N byte 存储位置:栈 含义: 记录每一项对应的斐波那契数
4、算法伪代码描述(或流程图)
第一版伪代码
初始化变量 将每一项的斐波那契数储存到数组中 输入所求项 输出所求的斐波那契数
第一次细化
开辟数组 第1项是0,第2项是1,第3项是1,第n项是q[n - 1] + q[n - 2];实现数组填充 输入n 输出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)9 no
3、数据空间描述:
数据类型:字符串,栈 变量名称:str 存储位置:栈 含义: 字符串来储存处理对象,栈来处理对象
4、算法伪代码描述(或流程图)
第一版伪代码
清除字符串中的非括号部分 分类左右括号 左括号入栈,右括号进行判断,注意边界条件 进行判断并输出
第一次细化
对于不是括号的内容进行跳过,使得字符串中保留括号部分 括号匹配函数(用来分类左右括号) 如果字符串长度为奇数,则no 如果栈中没有左括号,这时候来了一个右括号,则no 如果右括号不能与栈顶元素相匹配,则no 如果可以匹配,栈顶出栈 到最后如果栈不空,则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) 总结:该程序可以契合测试样例和期望结果,可基本解决题目问题。