最近写了一些编程题准备做一些笔记方便以后复习
1.字符串判等
题目描述
给定两个大小写字母、空格组成的字符串S1和S2,
他们的长度都不超过100个字符,长度也可以为零。
判断压缩掉空格并且忽略掉大小写后,这两个字符是否相等
输入
输入两行数据,两个字符串
输出
如果根据判定条件相等,则输出:YES!
否则输出:NO!
样例输入
S h i C H aO
s H I ch A o
样例输出
YES!
之前的思路,通过两字符串的字符一个一个比(因为c语言写多了就直接想到了这个思路)但是这样我为啥要用Python,用Python他的自带函数不香嘛。
ls = input().split(" ")
ls1 = input().split(" ")
st = ''.join(ls)
st1 = ''.join(ls1)
if len(st) != len(st1):
print("NO!")
else:
flag = 1
for i in range(len(st)):
if abs(ord(st[i])-ord(st1[i])) != ord('a')-ord('A') and abs(ord(st[i])-ord(st1[i]))!=0 :
print("NO!")
flag = 0
break
if flag:
print("YES!")
改进:
ls = input().lower().split(" ")
st =''.join(ls)
ls1 = input().lower().split(" ")
st1 = ''.join(ls1)
if len(st) !=len(st1):
print('NO!')
else:
if st == st1:
print('YES!')
else:
print('NO!')
因为它忽略掉大小写,那将其全部转化为小写,然后直接比较就好了,这样发现Python真香。
2.讨厌的小数点
题目描述
小明一直很讨厌小数点,一看到小数点就头疼。不幸的是,小红给他出了一个题目,问他:
给你一个小数x,你能算出小数点后第n位是什么吗?(1<=n<=6)
小明看到此题后,瞬间头疼晕倒,你能帮帮他吗?
输入
首先输入一个t,表示有t组数据,跟着t行:
每行输入一个小数(输入数据保证一定是a.b的形式,为了简单化问题,没有循环小数的情况),然后跟一个n,表示小数点后第几位。
输出
输出一个数表示小数点后第n位的数。
样例输入
3
1.234 1
2.345 2
3.456 3
样例输出
2
4
6
这个题有一个坑,就是如果输入n, 而小数点后第 n 位没没有的话,那么就输出 0,就是这个坑,这种题目老是想的不全面。
代码
#include<bits/stdc++.h>
#define N 200
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
char ch[N];
int b, j = 0;
cin >> ch >> b;
while (ch[j++] != '.');
if (j + b > strlen(ch))
printf("0\n");
else
printf("%c\n", ch[j + b - 1]);
}
return 0;
}
3.二的幂次方
题目描述
任何一个正整数都可以用2的幂次方表示。例如:137=2^7 + 2^3 + 2^0 同时约定用括号来表示方次,即a^b可以表示为a(b)。由此可知,137可以表示为:2(7)+2(3)+2(0) 进一步:7=2^2 + 2 + 2^0 ;3=2+2^0
所以最后127可以表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0) (n<=20000)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
这题应该很容易就想到要用到递归吗,然后你写一个递归函数,不管你的递归函数是否已经写好,你一定要认为这个函数已经实现了,这样你就可以安心在这个函数里调用他自己了。
def back(num):
if num <= 1:
return
st = str(bin(num)).replace("0b","")
index = []
#print(st)
for i in range(len(st)):
if st[len(st)-i-1] == '1':
#print(st[len(st) - i - 1])
index.append(i)
index.sort(reverse=True)
#print() # 7 1 1 1
for i in range(len(index)):
print("2", end='')
if index[i] == 2:
print("(2", end='')
elif index[i] == 1:
print("", end='')
elif index[i] == 0:
print("(0", end='')
else:
print("(",end='')
back(index[i])
if index[i]!=1:
print(")", end='')
if i != len(index)-1:
print("+", end='')
n = int(input())
back(n)
4.递归函数
题目描述
考虑如下的3参数递归函数w(a,b,c);
如果a≤0或b≤0或c≤0,则w(a,b,c)=1;
如果a>20或b>20或c>20,则w(a,b,c)=w(20,20,20);
如果a其他情况下:w(a,b,c)=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1, b-1,c-1)。
设计一个程序,快速计算w(a,b,c)并给出结果。
输入
1行整数,包含3个数值,分别对应a、b和c的值。
输出
一个数,即w(a,b,c)的结果。
样例输入
1 1 1
50 50 50
样例输出
2
1048576
这题很明显就是一道递归题,然后我们就很自然的写出这样的代码。但是一提交它就超时了。
#include<bits/stdc++.h>
using namespace std;
int w(int a, int b, int c)
{
if (a <= 0 || b <= 0 || c <= 0)
return 1;
else if (a > 20 || b > 20 || c > 20)
return 1048576;
else
return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
int main()
{
int a, b, c;
while (scanf("%d%d%d", &a, &b, &c) != EOF)
printf("%d\n", w(a, b, c));
return 0;
}
所以在这要引入动态规划来提高递归的效率,简单的说就是把每次递归的值保存到一个数组中,这样如果在递归中递归同样的数字就不需要再递归下去了,可以直接使用已经保存在数组中的值。
#include<bits/stdc++.h>
using namespace std;
int f[21][21][21];
int a, b, c;
int w(int a, int b, int c)
{
if (a <= 0 || b <= 0 || c <= 0)
return 1;
else if (a > 20 || b > 20 || c > 20)
return w(20, 20, 20);
else if (f[a][b][c])
return f[a][b][c];
else
f[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
return f[a][b][c];
}
int main()
{
while (scanf("%d%d%d", &a, &b, &c) != EOF)
printf("%d\n", w(a, b, c));
}