DDR爱好者之家 Design By 杰米

最近在跟着B站的视频(aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMW5xNHkxazdCNA==)学习,完整看完了,记的所有笔记,这些题目也可灵活多变,你可以思考,如何去使用C、JAVA、GO等语言实现,记得留在评论区,一起学习,共同成长。

题目1:水仙花数

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

for i in range(100, 1000):    i1 = i // 100       # 取百位数字 123//100=1    i2 = i // 10 % 10   # 取十位数字 123//10=12  12%10=2    i3 = i % 10         # 取个位数字 123%10=3    if i1 ** 3 + i2 ** 3 + i3 ** 3 == i:        print(f"{i}是水仙花数")        # 153 是水仙花数        # 370 是水仙花数        # 371 是水仙花数        # 407 是水仙花数

题目2:四叶玫瑰数

四叶玫瑰数是4位数的自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数,3位数的自幂数被称为水仙花数)。

for i in range(1000,10000):    i1 = i // 1000      # 取千位数字 1234//1000=1    i2 = i // 100 % 10  # 取百位数字 1234//100=12  12%10=2    i3 = i // 10 % 10   # 取十位数字 1234//10=123  123%10=3    i4 = i % 10         # 取个位数字 1234%10=4    # print(i,i1,i2,i3,i4)    if i1 ** 4 + i2 ** 4 + i3 ** 4 + i4 ** 4 == i:        print(f'{i}是四叶玫瑰数')        # 1634 是四叶玫瑰数        # 8208 是四叶玫瑰数        # 9474 是四叶玫瑰数

题目3:逆序输出字符串

# 写法1:切片方式str = input("请输入字符串")print(str[::-1])# 写法2:循环转换str = input("请输入字符串")list = []for x in range(len(str) -1,-1,-1):    list.append(str[x])print(''.join(list))

题目4:猜数字小游戏

需求分析:

  1. 随机生成一个100以内的整数,共有10次机会
  2. 开始游戏,输入猜测的数字
  3. 如果猜小了,提示猜小了
  4. 如果猜大了,提示猜大了
  5. 猜对了,提示猜对了,并且结束游戏
  6. 10次机会用完还没猜对,提示游戏结束,没有猜到。
import random as rdnumber = rd.randint(0,100)for i in range(10):    choice = int(input("请输入你要猜测的数字:"))    if choice > number:        print("你猜大了")    elif choice < number:        print("你猜小了")    else:        print("你猜对了,真棒!")        print(f'你一共用了{i + 1}次机会')        break    print(f'还剩{9 - i}次机会')else:    print('游戏结束,你没有猜到')

题目5:百鸡百钱

需求分析:

  1. 公鸡每只5元,母鸡每只3元,小鸡3只一元,现要求用100元钱买100只鸡(三种类型的鸡都要买),问公鸡、母鸡、小鸡各买几只?
  2. 数学:
  3. 设公鸡买了x只,母鸡买了y只,小鸡买了z只
  4. x+y+z= 100
  5. 5x+3y+z/3 = 100

    算法思路

    1. 以公鸡为突破点,公鸡5元一只,100元最多只能买20只,
    2. 由于三种鸡都要买,所以公鸡数一定是小于20的。
    3. 母鸡每只3元,100全拿来买母鸡,最多也不能超过33只
    4. 设公鸡数为x,母鸡数为y,小鸡z只
    5. 只要满足5x+3y+z/3=100 和 x+y+z==100 就可以输出此种组合的结果.
count = 0for x in range(1,20):    for y in range(1,33):        z = 100 - x -y        if z > 0 and 5 * x + 3 * y + z / 3 == 100:            count += 1            print("="*60)            print(f'第{count}种买法,公鸡买了{x}只,母鸡买了{y}只,小鸡买了{z}只')            # == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==            # 第1种买法,公鸡买了4只,母鸡买了18只,小鸡买了78只            # == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==            # 第2种买法,公鸡买了8只,母鸡买了11只,小鸡买了81只            # == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==            # 第3种买法,公鸡买了12只,母鸡买了4只,小鸡买了84只

题目6:闰年问题升级版

输入年月日,输出该日期是否是闰年,并且输出该日期是此年份的第几天

闰年判断条件:

  1. 能被4整除,并且不能被100整除
  2. 能被400整除
  3. 两个条件满足任意一个就为闰年

算法思路

  1. 接收用户输入的年月日,创建保存12个月份天数的列表
  2. 根据年份判断是否是闰年,如果是把二月份设为29天,否则把二月份设为28天
  3. 根据月份和日期统计是当年的第几天
year = int(input("请输入年份"))month = int(input("请输入月份"))day = int(input("请输入日期"))date_list = [31,29,31,30,31,30,31,31,30,31,30,31]count_day = dayif year % 4 == 0 and year % 100 !=0 or year % 400 == 0:    print(f'{year}年是闰年')    date_list[1]=29else:    print(f'{year}年是平年')    date_list[1]=28for i in range(month-1):    count_day += date_list[i]print(f'{year}年{month}月{day}日是当年的第{count_day}天')

题目7:猴子吃桃问题

需求分析:

  1. 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

  2. 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。

  3. 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。

  4. 求原来它一共摘了多少个桃子。

  5. 这题得倒着推。第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个。

  6. 假设第9天还没吃之前有桃子p个

  7. 可得:p/2 - 1 = 1,得出第九天的桃子数p=4。

  8. 以此类推,即可算出第一天摘了多少桃子.

算法思路

  1. 第10天还没吃之前的桃子数量初始化p=1
  2. 从9至1循环9次,根据上述公式反推为p=(p+1)*2可得
  3. 第1天还没吃之前的桃子数量
p = 1print(f'第10天还剩下{p}个桃子')for i in range(9,0,-1):    p = (p + 1) * 2    print(f'第{i}天还剩下{p}个桃子')print(f'第一天一共摘了{p}个桃子')# 第10天还剩下1个桃子# 第9天还剩下4个桃子# 第8天还剩下10个桃子# 第7天还剩下22个桃子# 第6天还剩下46个桃子# 第5天还剩下94个桃子# 第4天还剩下190个桃子# 第3天还剩下382个桃子# 第2天还剩下766个桃子# 第1天还剩下1534个桃子# 第一天一共摘了1534个桃子

题目8:冒泡排序

冒泡排序算法由来
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”

从前到后(即从下标较小的元素开始) 依次比较相邻元素的值,若发现比后一个值大则交换位置,使值较大的元素逐渐从前移向后部。

假设有一个列表 [29 ,12 ,19 ,37 ,14] 想升序

第一轮

第二轮

第三轮

第四轮

import numpy as nppop_list = np.random.randint(100,size=6)# pop_list = [82,15,15,41,37,31]# pop_list = [29,12,19,37,14]count = len(pop_list)print('没排序之前的列表',pop_list)for i in range(count-1):    for j in range(count-i-1):        if pop_list[j] > pop_list[j + 1]: # 如果要降序就是改成 < 号            pop_list[j],pop_list[j+1] = pop_list[j+1],pop_list[j]print('排好序的列表为',pop_list)# 排好序的列表为 [15, 15, 31, 37, 41, 82]# 排好序的列表为 [12, 14, 19, 29, 37]