写在开头的话
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 的内置排序函数,实际开发时比较有用。