shell 脚本编程
例题
例题1、一个月有多少天
#!/bin/bash
read year month
if [[ $month -eq 1 ]] || [[ $month -eq 3 ]] || [[ $month -eq 5 ]] || [[ $month -eq 7 ]] || [[ $month -eq 8 ]] || [[ $month -eq 10 ]] || [[ $month -eq 12 ]];then
echo 31
elif [[ $month -eq 4 ]] || [[ $month -eq 6 ]] || [[ $month -eq 9 ]] || [[ $month -eq 11 ]];then
echo 30
elif [ $month -eq 2 ];then
if [ "$((year % 4))" -eq 0 -a "$((year % 100))" -ne 0 ];then
echo 29
elif [ "$((year % 400))" -eq 0 ];then
echo 29
else
echo 28
fi
fi
例题2
班级里的白板笔不够了,班主任交给班长路飞一个小任务:买尽量多的白板笔。
已知一支白板笔的价格是2元6角,而班主任给路飞的钱是元角。
请你帮助路飞用程序解决这个问题。
输入
输入的数据,在一行内,包括两个整数,依次表示和,。
输出
输出一个整数,表示路飞最多能买多少只白板笔。
样例输入
10 3
样例输出
3
数据规模与约定
时间限制:3 s
100% 的数据保证
#!/bin/bash
read a b
A=`expr $a \* 10` # 注意, A和=之间不能有空格
C=`expr $A + $b` # `expr` 和=之间没有空格
B=`expr $C / 26` # $C / 26 之间要有空格
echo $B
例题3、计数问题
试计算在区间 到 的所有整数中,数字x ()共出现了多少次?
例如,在 1到11中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
输入
2个整数, ,之间用一个空格隔开。
输出
1个整数,表示出现的次数。
样例输入
1
11 1
样例输出**
1
4
数据规模与约定
时间限制:3 s
对于 100%的数据,
#!/bin/bash
read num target
sum=0
for ((i = 1; i <= $num; i++))
do
t=$i
ans=0
while [ $t -ne 0 ]
do
A=`expr $t % 10`
if [[ $A -eq $target ]];then
sum=`expr $sum + 1`
fi
t=`expr $t / 10`
done
done
echo $sum
例题4、校门口的树
#!/bin/bash
read L num
arrtarget=(0)//定义一个数组
sum=0
for ((i = 1; i <= $num; i++))
do
read left right
for ((j = $left; j < $[ $right + 1 ]; j++)) # $[]直接进行整数运算
do
if [[ ${arrtarget[$j]} -eq 1 ]];then
continue
fi
arrtarget[$j]=1
done
done
## 下面一个for循环可以去掉
for ((k = 0; k < $[ $L + 1 ]; k++))
do
if [[ ${arrtarget[$k]} -eq 1 ]];then
sum=$[ $sum + 1 ]
fi
done
A=$[ $L - $sum ]
echo $((`expr $A + 1`))
# 注意,不要使用太多expr ,容易超时
###################################修改后
#!/bin/bash
read L num
arrtarget=(0)
sum=0
for ((i = 1; i <= $num; i++))
do
read left right
for ((j = $left; j < $[ $right + 1 ]; j++))
do
if [[ ${arrtarget[$j]} -eq 1 ]];then
continue
fi
arrtarget[$j]=1
sum=$[ $sum + 1 ]
done
done
A=$[ $L - $sum ]
echo $ [$A + 1 ]
例题5、插队(数组)
有n个人(每个人有一个唯一的编号,用1~之间的整数表示)在一个水龙头前排队准备接水,现在第个人有特殊情况,经过协商,大家允许他插队到第个位置。输出第个人插队后的排队情况。
输入
第一行1个正整数,表示有个人,
第二行包含个正整数,之间用一个空格隔开,表示排在队伍中的第1~n第个人的编号。
第三行包含1个正整数,表示第n个人插队的位置,
输出*
一行包含个正整数,之间用一个空格隔开,表示第个人插队后的排队情况。
样例输入
7
7 2 3 4 5 6 1
3
样例输出
7 2 1 3 4 5 6
数据规模与约定**
时间限制:3 s
100% 的数据保证 ,
#!/bin/bash
arr=(0)
read n
read -a arr #直接读入一行数据到数组中
temp=${arr[$[ $n - 1 ]]}
read target
for ((j = $[ $n - 1 ]; j >= $[ $target - 1 ]; j--))
do
arr[$j]=${arr[$[ $j - 1 ]]}
done
arr[$[ $target - 1 ]]=$temp
for((i = 0; i <= $[ $n - 1 ] ; i++))
do
echo -n ${arr[$i]} # echo -n 表示不换行
echo -n " "
done
例题6、走楼梯
一个楼梯有n 级,小苏同学从下往上走,一步可以跨一级,也可以跨两级。
问:他走到第 n级楼梯有多少种走法?
输入
一行一个整数 。
输出
一行个整数,之间用一个空格隔开,表示走到第1级、第2级、……第n级分别有多少种走法。
样例输入
2
样例输出
1 2
数据规模与约定
时间限制:3 s
100% 的数据保证
#!/bin/bash
declare -a arr#声明一个数组
read n
arr[1]=1 # 斐波那契数列
arr[2]=2
for ((i=3; i <= $n; i++))
do
arr[$i]=$[${arr[$[$i - 1]]} + ${arr[$[$i - 2]]}]
done
for ((i = 1; i <= $n; i++)); do
echo -n ${arr[$i]}" " #不换行输出带空格
done
例题7、比身高
有n个人排成一排,假设他们的身高均为正整数,请找出其中符合以下条件的人:
排在他前面且比他高的人数与排在他后面且比他高的人数相等。
输入
第一行为一个正整数,,表示有多少个人。
下面行,每行一个正整数,表示从前往后每个人的身高,假设第 个人的身高为。
输出
一行一个整数,表示满足这个条件的人数。
样例输入*
4
1
2
1
3
样例输出
2(第三第四个符合)
数据规模与约定
时间限制:3 s
100% 的数据保证 ,第 个人的身高为。
#!/bin/bash
declare -a arr
read n
sum=0
for ((i = 1; i <= $n; i++)); do
read num
arr[$i]=$num
done
for ((i=1; i <= $n; i++)); do
t1=0
t2=0
for ((j=1; j < $i; j++));do
if [[ ${arr[$j]} -gt ${arr[$i]} ]];then
t1=$[ $t1 + 1 ]
fi
done
for ((k=$[ $i + 1 ]; k <= $n; k++)); do
if [[ ${arr[$k]} -gt ${arr[$i]} ]];then
t2=$[ $t2 + 1 ]
fi
done
if [[ $t1 -eq $t2 ]];then
sum=$[ $sum + 1 ]
fi
done
echo $sum
例题8、走楼梯(递推)
这一节我们需要讨论的是一个递推的问题。在海贼理工学院有一个路飞君,他在爬楼梯的时候从来都是要么上 2个台阶,要么上 3个台阶。由于爬楼梯实在太无聊了,路飞君就开始尝试每天采用不同的方式上楼梯。如果路飞君回家需要爬n 阶台阶,你能告诉路飞君,他爬楼梯回家有多少种不同的方式吗?
请注意,路飞君“先爬 2个台阶后爬 个台阶”和“先爬 3个台阶后爬 个台阶”是两种不同的回家方式。
输入
测评机会反复运行你的程序。每次程序运行时,你的程序仅需输入一个符合描述的整数 , 表示总共的台阶数( )。
输出
输出为一行,输出一个整数,表示路飞君有多少种上楼梯的方式。最后结果保证在 int
范围 内。
样例输入1*
5
样例输出1**
2
样例输入2
40
样例输出2
31572
#这是cd的,自己修改一下呗
#include <stdio.h>
int main() {
int n;
int step[51];
scanf("%d",&n);
step[1] = 0;
step[2] = step[3] = 1;
for (int i = 4; i <=n; i++){
step[i] = step[i-2] + step[i-3] ; }
printf("%d",step[n]);
return 0;
}
例题9、斐波那契数列
相信小伙伴们都学过斐波那契数列,它是这样的一个数列: 0 1 1 2 3 5 8 13 21 …
用 表示斐波那契数列的第n 项,则有: 。
输入一个数, 求出斐波那契数列第n项。
输入
输入一个整数 。
输出
输出的值。
样例输入1
3
样例输出1
2
数据规模与限定
时间限制:3 s
100% 的数据保证
#!/bin/bash
#斐波那契数列后一个数字永远是前 2 个数字之和
#如:0 1 1 2 3 5 8 13 ... ...
read n
list=(0 1)
for i in `seq 2 30`
do
list[$i]=`expr ${list[-1]} + ${list[-2]}`
done
echo ${list[$n]}
#echo ${list[$[ $n - 1 ]]}
写于2021-07-29