经典C语言程序设计100例 -- C 和 Python 版 (01 - 05)

写在开头的话
Python 重写C语言程序设计百例,每篇5题,每题分别用C语言和Python实现,方便对比。
    C语言编译器:GCC 4.8.2
    Python版本:Python 3.4
写这个系列是受这位博主(http://blog.csdn.net/berguiliu?viewmode=contents)的启发,自己想重写一遍,使用更加Python化的风格——简洁。如有问题或疏漏,非常欢迎在评论中指出。

【01】各位互异的三位数
题目:输出由数字{1, 2, 3, 4}组成的所有三位数,不能重复,每个数字最多只能出现一次。
思路:采用穷举法。从这4个数字中选择3个数字进行全排列,然后过滤掉不符合条件的。
C 语言代码

#include <stdio.h>

int main()
{
    for (int x = 1; x <= 4; ++x)
        for (int y = 1; y <= 4; ++y)
            for (int z = 1; z <= 4; ++z)
            {
                if (x != y && x != z && y != z)
                {
                    printf("%d%d%d ", x, y, z);
                }
            }
    return 0;
}
Python 代码
m = [1, 2, 3, 4]
for x in m:
    for y in m:
        for z in m:
             if (x != y != z) and (x != z):
                print('{0}{1}{2}'.format(x, y, z), end=' ')  
或
m = [1, 2, 3, 4]
x = [str(x)+str(y)+str(z) for x in m for y in m for z in m
if x != y != z and x != z]
for k in x:
    print(int(k), end=' ')
点评:Python中不等式可以连写,这样可简化代码。利用列表推导式也是简化代码的一个手段。

【02】if-else 练习
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
    于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
    成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
    40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
    100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
思路:主要时考察分支判断结构的掌握。
C 语言代码
#include <stdio.h>

int main()
{
    double i;
    double bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
    scanf("%lf",&i);
    bonus1=100000*0.1;
    bonus2=bonus1+100000*0.075;
    bonus4=bonus2+200000*0.05;
    bonus6=bonus4+200000*0.03;
    bonus10=bonus6+400000*0.015;
    if(i<=100000)
        bonus=i*0.1;
    else if(i<=200000)
        bonus=bonus1+(i-100000)*0.075;
    else if(i<=400000)
        bonus=bonus2+(i-200000)*0.05;
    else if(i<=600000)
        bonus=bonus4+(i-400000)*0.03;
    else if(i<=1000000)
            bonus=bonus6+(i-600000)*0.015;
    else
        bonus=bonus10+(i-1000000)*0.01;
    printf("bonus=%lf",bonus);
    return 0;
}
Python 代码
def fun(profit = 0):
        # 奖金
        bonus = 0
        bonus10 = 100000 * 0.1      
        bonus20 = bonus10 + (200000 - 100000) * 0.075
        bonus40 = bonus20 + (400000 - 200000) * 0.05
        bonus60 = bonus40 + (600000 - 400000) * 0.03
        bonus100 = bonus60 + (1000000 - 600000) * 0.015

        if profit <= 100000:
                bonus = profit * 0.1
        elif profit <= 200000:
                bonus = bonus10 + (profit - 100000) * 0.075
        elif profit <= 400000:
                bonus = bonus20 + (profit - 200000) * 0.05
        elif profit <= 600000:
                bonus = bonus40 + (profit - 400000) * 0.03
        elif profit <= 1000000:
                bonus = bonus60 + (profit - 600000) * 0.015
        else:
                bonus = bonus100 + (profit - 1000000) * 0.01
        return bonus

profit = input('profit = ')
print('bonus = ', fun(profit))

【03】完全平方数
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
         (如果一个数的平方根的平方等于该数,这说明此数是完全平方数)
思路:采用穷举法。
C语言代码
#include <stdio.h>
#include <math.h>

int main()
{
    int a = 0, b = 0;
    for (int i = 0; i < 10000; ++i)
    {
        a = sqrt(i + 100);
        b = sqrt(i + 268);
        if ((a*a == i+100) && (b*b == i+268))
        {
            printf("%d\n", i);
        }
    }
    return 0;
}
Python 代码
for x in range(100000):
    if int(sqrt(x+100))**2 == x + 100 and int(sqrt(x+268))**2 == x + 268:
        print(x)
点评:Python中 “**” 表示求幂级数

【04】闰年判断
题目:输入年月日,判断这一天是这一年的第几天?
思路:每月的天数相加,再加上当前的号数。关键点:闰年的二月有29天,如果输入的月份大于两个月时,需要判断是否为闰年来决定二月的天数。
闰年定义:公元年数可被4整除为 闰年,但是整百的年数必须是可以被400整除的才是闰年。(四年一闰,百年不闰,四百年再闰)
C 语言代码
// 输入: 年-月-日
// 返回:输入日期距离当年1月1日的天数
int whichDay(int year, int month, int day)
{
    // 每月对应的天数
    static int M[] = {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    // 存储当前日期距离当年年1月1日的天数
    int count = 0;

    // 如果当年是闰年,设置二月为29天
    if ((year % 4 == 0) ||
        ((year % 100 == 0) && (year % 400 == 0)))
        M[1] = 29;

    // 检查日期是否合法, 如果不合法,返回-1
    if (month < 1 || month > 12)
        return -1;
    if (day < 1 || day > M[month-1])
        return -1;

    // 计算
    for (int i = 0; i < month - 1; ++i)
    {
        count += M[i];
    }
    count += day;

    return count;
}
Python 代码

def whichDay(year, month, day):
    M = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    count = 0

    # 判断闰年,如果时闰年,设置二月为29天
    if (year % 4 == 0) or (year % 100 == 0 and year % 400 == 0):
        M[1] = 29

    # 检查日期合法性
    if not (year >= 1 and 1 <= month <= 12 and 1 <= day <= M[month-1]):
        return -1

    # 计算
    for m in M[:month-1]:
        count += m
    count += day

    return count

【05】比较三个数的大小
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
C语言代码
#define SWAP(px, py) (*px = *px + *py, \
                      *py = *px - *py, \
                      *px = *px - *py)

void fun(int x, int y, int z)
{
    if (x > y)
        SWAP(&x, &y);
    if (y > z)
        SWAP(&y, &z);
    if (x > y)
        SWAP(&x, &y);
    printf("%d < %d < %d\n", x, y, z);
}
Python 代码
def fun(x, y, z):
    if x > y:
        x,y = y,x
    if y > z:
        y,z = z,y
    if x > y:
        x,y = y,x
    print('%d < %d < %d' % (x, y, z))
# 利用 Python 内置的排序函数
def fun2(*values):
    newValues = sorted(values)
    print(newValues)
# 利用 Python 内置的排序函数
def fun2(*values):
    newValues = sorted(values)
    print(newValues)
点评: fun() 中交换 x 、y 的值很自然,这是Python语言的特点,要多加利用。fun2() 利用了 Python 的内置排序函数,实际开发时比较有用。

你可能感兴趣的:(python,C语言,程序设计)