问题
(问题都是来源某牛的题,用matlab编程实现)
小易参加了一次考试,这场包含 n 个题目,第 i 个题目的分数是 si 。
如果小易第 i 题目回答正确,他将得到 Si 分,否则该题目他将得到 0 分。
最终的考试得分是所有题目得分的总和。
由于阅卷老师很讨厌数字 5,在阅卷时如果一个学生的考试总分中含有数字 5,那么阅卷老师将气愤地给他 0 分。
那么小易考试的最高得分是多少?
输入例子
5 15 5 15 5
输出例子
40
例子说明
如果所有题目都答对,总分为45,但里面包含了数字5,所以最高得分应该为40
解题思路
1.先升序排序
2.和值转字符串
3.循环判断和值内是否有字符 '5’
4.有 ‘5’ 则删除
Matlab代码实现
s=[50 5 100];
s=sort(s); %先排序,按从小到大删除
disp(s);
%% 出现总分出现5时,应该进行某一个题目分数归0
strSum=num2str(sum(s)); %将总分数转换为字符串
i=1;
while i<=size(strSum,2)
if strSum(i)=='5' %有5,处理
flag=0; %flag用于指示本次循环是否删除成功
for j=1:size(s,2) %遍历删除一个满足条件的最小值,有可能删除一个还是不满足
tmp=num2str(sum(s)-s(j));
if tmp(size(tmp,2))~='5' %减去一个数后判断末尾是否为5,不为5则成功减去
news=[];
for k=1:size(s,2)
if k~=j
news=[news,s(k)];
end
end
s=news; %更新s
strSum=num2str(sum(s)); %更新求和
flag=1; %已经删除
break;
end
end
%% 遍历一次不满足(无论删除那个还是有5),必须删除一个最小值
if flag==0
news=[];
for k=2:size(s,2)
news=[news,s(k)];
end
s=news;
strSum=num2str(sum(s));
end
i=1;
else
i=i+1; %无5,游标游走
end
end
disp(sum(s));
python代码实现
A=[5,50,100]
A=sorted(A) #升序排序
SsumA='%d' % sum(A)
while SsumA.count('5')!=0: #和值有5,处理
flag=0
for i in range (len(A)):
tmp=A[i]
sumA=sum(A)-tmp
SsumA='%d' % sumA
if SsumA[-1]!='5':
del A[i]
flag=1
break
if flag==0:
del A[i]
SsumA='%d' % sum(A)
print(sum(A))
总结
对比Matlab和python的代码可以发现,确实python的语法风格更加灵活,实现也更加简洁,看来matlab确实比较适合做仿真…