鱼C论坛

 找回密码
 立即注册
查看: 9776|回复: 67

[技术交流] Python:每日一题 165

[复制链接]
发表于 2018-3-16 20:44:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-3-18 20:16 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
本题是 @Chase_Kas 提供的。原题是打印乘法口诀表。
1.jpg
考虑到题目过于简单,改成打印中文的吧。
2.jpg
要求使用循环语句或等同于循环的方法。
一一得一    
一二得二    二二得四    
一三得三    二三得六    三三得九    
一四得四    二四得八    三四一十二  四四一十六  
一五得五    二五一十    三五一十五  四五二十    五五二十五  
一六得六    二六一十二  三六一十八  四六二十四  五六三十    六六三十六  
一七得七    二七一十四  三七二十一  四七二十八  五七三十五  六七四十二  七七四十九  
一八得八    二八一十六  三八二十四  四八三十二  五八四十    六八四十八  七八五十六  八八六十四  
一九得九    二九一十八  三九二十七  四九三十六  五九四十五  六九五十四  七九六十三  八九七十二  九九八十一 

感谢 @Chase_Kas 提供题目,也希望大家有适宜的题目提供给我们,共同把每日一题这个项目做好。请 @Chase_Kas 多回一帖,给予出题奖励。
要求:
题目难易适度,以python语言的运用为主,算法为辅。
对于提供优质题目的鱼油给予鱼币奖励。
可以发私信给我或直接发帖。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-16 21:14:17 | 显示全部楼层
本帖最后由 天圆突破 于 2018-3-17 15:11 编辑
def nine():
    dct = dict(zip([str(i) for i in range(10)], ['','一', '二', '三', '四', '五', '六', '七', '八', '九']))
    num = lambda s:'得'+dct[str(s)] if s < 10 else dct[str(s)[0]] + '十' + dct[str(s)[1]]

    for i in range(1,10):
        for j in range(1,i+1):
            print('%s%s%s'%(dct[str(j)], dct[str(i)],num(i*j)),end = '\t'+(i==j)*'\n')

if __name__ == '__main__':
    nine()

负优化一下
dct = dict(zip([i for i in range(10)], ['', '一', '二', '三', '四', '五', '六', '七', '八', '九']))
num = lambda s: '得' + dct[s] if s < 10 else dct[s//10] + '十' + dct[s%10]
for i in [dct[i]+dct[j]+num(i*j) + '\t' + (i==j)*'\n' for i in range(1,10) for j in range(1,i+1)]:print(i, end = '')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 21:39:12 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-3-16 21:41 编辑
##  有些字体对齐可能会出问题,我用的“方正小标宋简体”,英文的Arial字体经验证对齐也没问题。

hanzi = '一二三四五六七八九'
shuzi = list(range(1,10))
dict1 = dict(zip(shuzi, hanzi))
for i in range(10, 82):
    s = ''
    shiwei = i//10
    gewei = i%10
    s += dict1[shiwei]+'十'
    if gewei != 0:
        s += dict1[gewei]
    dict1[i] = s

for i in range(1, 10):
    for j in range(1, i+1):
        a = dict1[j]
        b = dict1[i]
        c = dict1[i*j]
        d = ''
        if i*j < 10:
            d = a + b + '得' + c
        else:
            d = a + b + c
        print(d, end = '\t')
    print()
1.png

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-3-16 21:39:48 | 显示全部楼层
table = {1:'一', 2:'二', 3:'三', 4:'四', 5:'五',
         6:'六', 7:'七', 8:'八', 9:'九', 0:''}


def print_mutiple_table():
    for row in range(1, 10):  #行标
        for col in range(1, row+1):  #列标
            result = row * col
            if result < 10:
                print(table[col] + table[row] +  '得' + table[result], end=' ')
            else:
                a = result // 10 #十位数
                b = result % 10 #个位数
                print(table[col] + table[row] + table[a] + '十' + table[b], end=' ')
        print()

print_mutiple_table()

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 21:59:32 | 显示全部楼层
numstr = [' ','一','二','三','四','五','六','七','八','九']
for i in range(1, 10):
    for j in range(1, 10):
        if j <= i:
            if i * j < 10:
                result = numstr[j] + numstr[i] + '得' + numstr[i*j]
                print(result.ljust(7),end = '')
            else:
                result = numstr[j] + numstr[i] + numstr[i*j//10] + '十'+ numstr\
                         [i*j%10]
                if i*j%10 == 0:
                    print(result.ljust(7),end = '')
                else:
                    print(result.ljust(6),end = '')
    print('\n')

对齐比较麻烦,不知道有没有什么更好的方法

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 22:02:04 | 显示全部楼层
str1 = '一二三四五六七八九'
for i in range(9):
    for j in range(i+1):
        n = (i+1)*(j+1)         #乘积
        ten_num = n // 10       #乘积的十位数
        single_num = n % 10     #乘积的个位数
        #str2存储乘积转化成的中文字符串
        if ten_num == 0:
            str2 = str1[single_num-1]
            print(str1[j] + str1[i] + '得' + str2 ,end = '\t')
        else:
            if single_num == 0:
                str2 = str1[ten_num-1] + '十'
                print(str1[j] + str1[i] + str2 ,end = '\t')
            else:
                str2 = str1[ten_num-1] + '十' + str1[single_num-1]
                print(str1[j] + str1[i] + str2 ,end = '\t')                        
    print('\n')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 22:16:37 | 显示全部楼层
本帖最后由 steph0216 于 2018-3-17 23:28 编辑
dic = {0: ' ',1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七', 8: '八', 9: '九'}
result = ''
for i in range(1, 10):
    for j in range(1, i+1):
        result += str(j)+str(i)+( (not i*j//10)*'得' )+( bool(i*j//10)*'十' ).join(str(i*j))+' '
    result += '\n'
for i in range(10):
    result = result.replace(str(i), dic[i])
print(result[:-2])

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 22:51:07 | 显示全部楼层
def num(n):
    chinse = ['','一','二','三','四','五','六','七','八','九','十']
    num_1 = 0 # 个位
    num_2 = 0 # 十位
    if n < 10:
        return chinse[n]
    else:
        num_1 = n // 10
        num_2 = n % 10
        return chinse[num_1] +chinse[num_2]
for i in range(1,9):
    for j in range(1,i+1):
        print("%s%s得%2s" %(num(j), num(i),num(i*j)), end='\t')
    print('\t') 

点评

不是都有“得”  发表于 2018-3-18 20:19

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 23:02:03 | 显示全部楼层
本帖最后由 Agoni 于 2018-3-16 23:26 编辑

    chinse = ['','一','二','三','四','五','六','七','八','九']
    if n < 10:
        return chinse[n]
    else:
        x = n // 10
        y = n % 10
        return chinse[x] + '十' + chinse[y]

for i in range(1,10):
    for j in range(1,i+1):
        print("%s%s得%2s" %(num(j), num(i),num(i*j)), end='\t')
    print('\t')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 23:05:03 | 显示全部楼层
S='得一二三四五六七八九'
for i in range(1,10):
    for j in range(1,i+1):
        a=i*j
        b=S[j]+S[i]+S[a//10]
        if a<10:
            b+=S[a%10]+'  '
        else:
            b=b+'十'+S[a%10]
            if a%10==0:
                b=b[:-1]+'  '
        print(b,end=' ')
    print()

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 23:21:37 | 显示全部楼层
cn = ['一','二','三','四','五','六','七','八','九']

def c():
        for x in range(1,10):
            for y in range(1,x+1):
                B,A,Z = t(x,y)
                print('{}{}{}\t'.format(B,A,Z),end='')
            print()

def t(x,y):
    A = cn[x - 1]
    B = cn[y - 1]
    z = x*y
    Z = ''
    if z>10:
        Z = cn[int(str(z)[0])-1]+'十'+cn[int(str(z)[1])-1]
    elif z == 10:
        Z = cn[int(str(z)[0])-1]+'十'
    else:
        Z = '得'+cn[z - 1]
    return B,A,Z

点评

没有运行c()  发表于 2018-3-18 20:23

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 23:28:41 | 显示全部楼层
dict1 = {1:"一",2:"二",3:"三",4:"四",5:"五",6:"六",7:"七",8:"八",9:"九",0:"十"}
def re(i,j):
    """求结果的函数"""
    book = int(j*i)
    #格式转换
    if book<10:
        print(end=' ')
        return dict1[book]
    elif book%10==0:
        #求十位上的数字
        shi = book//10
        #求个位上的数字
        ge = 0
        print(end=' ')
        #拼接结果
        return dict1[shi]+dict1[ge]
    else:
        shi = book//10
        ge = book%10
        print(end=' ')
        return dict1[shi]+"十"+dict1[ge]
for i in range(1,10):
    for j in range(1,i+1):
        #判断结果范围
        if i*j<10:
            print(str(dict1[j])+str(dict1[i])+"得"+re(i,j),end='')
        else:
            print(str(dict1[j])+str(dict1[i])+re(i,j),end='')
    print("\n")

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 00:15:53 | 显示全部楼层
for i in range(1,10):
    st=''
    for j in range(1,i+1):
        #print(i,j)
        zd={1:'一',2:'二',3:'三',4:'四',5:'五',6:'六',7:'七',8:'八',9:'九',10:'十'}
        ss=''
        ss+=zd[j]+zd[i]
        if i*j>10 :
            if i*j%10!=0 :
                ss+=zd[i*j//10]+zd[10]+zd[i*j%10]
            else :
                ss+=zd[i*j//10]+zd[10]
        else :
            ss=ss+'得'+zd[i*j]
        if len(ss)==4:
            ss+='  '
        st+=ss+'  '
    print(st)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 00:19:47 | 显示全部楼层
本帖最后由 wyf345491656 于 2018-3-17 00:23 编辑
list1 = [' ','一','二','三','四','五','六','七','八','九','十']
for i in range(1,10):
        for j in range(1,i+1):
                if i*j < 10:
                print('{}{}得{}\t'.format(list1[j],list1[i],list1[i*j]),end='')
                else:
                print('{}{}{}{}{}\t'.format(list1[j],list1[i],list1[i*j//10],'十',list1[i*j % 10]),end='')
        print()

点评

缩进不对  发表于 2018-3-18 20:25

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 09:02:07 | 显示全部楼层
def intTostr(num):
    str_list=['一','二','三','四','五','六','七','八','九','十']
    shi=num//10
    ge=num%10
    if shi==0:
        return str_list[ge-1]
    elif ge==0:
        return str_list[shi-1]+'十'
    else:
        return str_list[shi-1]+'十'+str_list[ge-1]
str_result=''
for i in range(1,10):
    for j in range(1,i+1):
        tmp=str.format("%s %s 得 %s" %(intTostr(j),intTostr(i),intTostr(i*j)))
        if len(tmp)==7:
            tmp=tmp+"      "
        elif len(tmp)==8:
            tmp = tmp + "    "
        else:
            tmp=tmp+"  "
        str_result+=tmp
    print(str_result)
    str_result = ''

点评

不是都有“得”  发表于 2018-3-18 20:25

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 09:38:42 | 显示全部楼层
def transform(number):
        str1 = '一二三四五六七八九'
        if number < 10:
                return str1[number-1]
        elif number % 10 == 0:
                return str1[number//10-1] + '十'
        else:
                return str1[number//10-1] + '十' + str1[number%10-1]

def tables():
        for i in range(1,10):
                for j in range(1,i+1):
                        if i * j < 10:
                                print('%s%s得%s' % (transform(j),transform(i),transform(i*j)),end = '  ')
                        else:
                                print('%s%s%s'%(transform(j),transform(i),transform(i*j)),end = '  ')
                print('')

if __name__ == '__main__':
        tables()
        
结果:
一一得一  
一二得二  二二得四  
一三得三  二三得六  三三得九  
一四得四  二四得八  三四一十二  四四一十六  
一五得五  二五一十  三五一十五  四五二十  五五二十五  
一六得六  二六一十二  三六一十八  四六二十四  五六三十  六六三十六  
一七得七  二七一十四  三七二十一  四七二十八  五七三十五  六七四十二  七七四十九  
一八得八  二八一十六  三八二十四  四八三十二  五八四十  六八四十八  七八五十六  八八六十四  
一九得九  二九一十八  三九二十七  四九三十六  五九四十五  六九五十四  七九六十三  八九七十二  九九八十一  

***Repl Closed***

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 09:59:22 | 显示全部楼层
num=['一','二','三','四','五','六','七','八','九','十']
for x in range(1,10):
    for y in range(1,x+1):
        multi= y*x
        multi1= multi%10
        multi2= multi//10
        if multi<10:
            print(num[y-1],num[x-1],'得',num[multi-1],'\t',end='')
        if multi==10:
            print(num[y-1],num[x-1],num[multi2-1],num[multi1-1],'\t',end='')
        if multi >10:
            print(num[y-1],num[x-1],num[multi2-1],num[-1],num[multi1-1],'\t',end='')
    if y==x:
        print('\n')
打印如下:
一 一 得 一        

一 二 得 二         二 二 得 四        

一 三 得 三         二 三 得 六         三 三 得 九        

一 四 得 四         二 四 得 八         三 四 一 十 二         四 四 一 十 六        

一 五 得 五         二 五 一 十         三 五 一 十 五         四 五 二 十 十         五 五 二 十 五        

一 六 得 六         二 六 一 十 二         三 六 一 十 八         四 六 二 十 四         五 六 三 十 十         六 六 三 十 六        

一 七 得 七         二 七 一 十 四         三 七 二 十 一         四 七 二 十 八         五 七 三 十 五         六 七 四 十 二         七 七 四 十 九        

一 八 得 八         二 八 一 十 六         三 八 二 十 四         四 八 三 十 二         五 八 四 十 十         六 八 四 十 八         七 八 五 十 六         八 八 六 十 四        

一 九 得 九         二 九 一 十 八         三 九 二 十 七         四 九 三 十 六         五 九 四 十 五         六 九 五 十 四         七 九 六 十 三         八 九 七 十 二         九 九 八 十 一        

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 10:09:14 | 显示全部楼层
def convert(n):
    num=[1,2,3,4,5,6,7,8,9,0]
    cn=['一','二','三','四','五','六','七','八','九','']
    dw=['','十','百','千','万']
    n=str(int(n))
    c=len(n)-1
    ln=''
    c1=0;
    for i in n:
        nb = int(i) - 1
        if i=='0' and c1==0:
            c1=1
            pass
        else:
            if c1==1:
               c1=0
            ln=ln+ cn[nb]+dw[c]
        c=c-1
    return(ln)
for i in range(1, 10):
        for j in range(1, i+1):
            print (convert(j),convert(i),convert(i*j),end='    ') if i*j>=10 else print (convert(j),convert(i),'得',convert(i*j),end='    ')
        print()

点评

部分没有对齐  发表于 2018-3-18 20:27

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 11:10:14 | 显示全部楼层
本帖最后由 victor.xu 于 2018-3-17 13:14 编辑

写出汉字版的乘法表没几分钟,但是调试到对齐,花了好久。
dic = {0:'    ', 1:'一', 2:'二', 3:'三', 4:'四', 5:'五', 6:'六', 7:'七', 8:'八',9:'九', 10:'十'}
for i in range(1, 10):
    for j in range(1,i+1):
        if i * j < 10:
            st = '%s%s得%s' %(dic[j], dic[i], dic[i * j])
            print('%-10s'%st, end = '     ')
        else:
            result = dic[(i * j) // 10] + dic[10] + dic[(i * j) % 10]
            st = '{}{}得{}'.format(dic[j], dic[i], result)
            print('%-8s'%st, end = '     ')
    print()

点评

不是都有“得”  发表于 2018-3-18 20:27

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 12:15:09 | 显示全部楼层
本帖最后由 elang696 于 2018-3-17 12:16 编辑
def int_to_cn(i,j):
    num_dict = {1:'一',2:'二',3:'三',4:'四',5:'五',6:'六',7:'七',8:'八',9:'九',10:'十'}

    result = j * i
    tens = result // 10
    units = result % 10
    tens_cn = ''
    units_cn = ''
    if tens:
        tens_cn = num_dict[tens] 
    if units:
        units_cn = num_dict[units] 
    if tens:
        result_cn = num_dict[j] + num_dict[i] + tens_cn + '十' + units_cn
    else:
        result_cn = num_dict[j] + num_dict[i] + '得' + units_cn
    return result_cn

if __name__ == '__main__':
    for i in range(1,10):
        for j in range(1,i+1):
            result_cn = int_to_cn(i,j)
            print(result_cn.center(8),end='') if len(result_cn)==4 else print(result_cn.center(7),end='')      
        print('')
  一一得一  
  一二得二    二二得四  
  一三得三    二三得六    三三得九  
  一四得四    二四得八   三四一十二  四四一十六 
  一五得五    二五一十   三五一十五   四五二十   五五二十五 
  一六得六   二六一十二  三六一十八  四六二十四   五六三十   六六三十六 
  一七得七   二七一十四  三七二十一  四七二十八  五七三十五  六七四十二  七七四十九 
  一八得八   二八一十六  三八二十四  四八三十二   五八四十   六八四十八  七八五十六  八八六十四 
  一九得九   二九一十八  三九二十七  四九三十六  五九四十五  六九五十四  七九六十三  八九七十二  九九八十一 

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 20:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表