C语言经典算法02
2013-12-24 00:34
232 查看
11.判断某一年是否是闰年。
[cpp] viewplaincopy
//判断某一年份是否是闰年
int IsLeapYear(int year)
{
return (year % 400 == 0 || (year % 4 == 0) && (year % 100 != 0));
}
运行结果:
12.获得某年、某月的最大天数。
[cpp] viewplaincopy
//获得某年、某月的最大天数
int GetMaxDay(int year,int month)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
return IsLeapYear(year)?29:28;
default:return -1;
}
}
运行结果:
13.输入某年某月某日,判断这一天是这一年的第几天?
[cpp] viewplaincopy
//输入某年某月某日,判断这一天是这一年的第几天?
/*
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
情况,闰年且输入月份大于3时需考虑多加一天。
*/
int GetDays(int year,int month,int day)
{
int sum = 0;
int i;
for(i = 1; i < month; i++) //将前几个月天数相加
sum += GetMaxDay(year,month);
sum = sum + day; //加上本月的天数,就是总天数
return sum;
}
运行结果:
更多关于日期的算法,请参见我的博客《关于日期的常用算方法》(java版)。
14.求一个数的阶乘。
[cpp] viewplaincopy
//递归求阶乘
long factorial(long n)
{
if(n <= 1)
return 1;
else
return n * factorial(n-1);
}
//非递归求阶乘
long Factorial(long n)
{
int sum,i;
sum = 1;
for(i = 1; i <= n; i++)
sum *= i;
return sum;
}
运行结果:
这里求得的阶乘只能是较小数的阶乘,想求得200或更大数的阶乘就无能无力了,所以必须通过其他的算法来实现。
关于更大数的阶乘,大家可以参见我的博客《大数阶乘的实现》
15.求两个数的最大公约数和最小公倍数。
[cpp] viewplaincopy
//求两个数的最大公约数
int gcd(int a,int b)
{
int r;
if(a < b) //a < b,则交换两个数
{
int temp = a;
a = b;
b = temp;
}
r = a % b;
while(r != 0)
{
a = b;
b = r;
r = a % b;
}
return b;
}
//求两个数的最小公倍数数
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
运行结果:
16.打印出三位的"水仙花数",所谓"水仙花数"是指一个N位数,其各位数字立方和等于该数。
[cpp] viewplaincopy
//打印出三位的"水仙花数",所谓"水仙花数"是指一个N位数,其各位数字立方和等于该数
void WaterFlowerNumber()
{
int i,j,k,n;
printf("Water flower number is:");
for(n = 100; n < 1000; n++)
{
i = n/100; //分解百位
j = n/10 % 10; //分解十位
k = n % 10; //分解个位
if(i*i*i + j*j*j + k*k*k == n)
printf("%-5d\n",n);
}
}
运行结果:
大家还可以考虑一下,如何打印21位“水仙花”数? (基本思想和《大数阶乘的实现》及《求任意位数的Pi》的思想相同,即用数组存储)。
17.不依赖第三个变量,实现两个整数交换。
[cpp] viewplaincopy
/不依赖第三个变量,实现两个整数交换
//第一种方法
void Exchange1(int* a,int* b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
//第二种方法(用位运算)
void Exchange2(int* a,int* b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
运行结果:
18.将10进制的数转换为2-16进制。
[cpp] viewplaincopy
//将10进制数转换为其它进制
void From10baseTransformTo1_16(int m,int base)
{
char num[] = "0123456789ABCDEF";
char result[30] = {0};
int len = 0;
char temp;
int start = 0;
int end = len;
while(m) //辗转相除,先存正向的余数
{
result[len++] = num[m%base];
m = m / base;
}
start = 0;
end = len-1;
while(start < end) //字符串翻转
{
temp = result[start];
result[start] = result[end];
result[end] = temp;
start++;
end--;
}
start = 0;
for(start = 0; start < len; start++)
printf("%c",result[start]);
printf("\n");
}
运行结果:
19.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
[cpp] viewplaincopy
//将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
void DivideFactor(int n)
{
int i;
printf("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
{
break;
}
}
}
printf("%d",n);
}
运行结果:
20.猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
[cpp] viewplaincopy
void MonkeyEatPeach()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
x2=x1;
day--;
}
printf("the total is %d\n",x1);
}
运行结果:
相关文章推荐
- 算法竞赛入门经典第二版第一章语言篇
- C语言经典算法03
- 【分享】一些经典的C/C++语言基础算法及代码(四)
- C语言经典算法77-86
- 经典算法1---相似度--模糊查询,查抄袭,语言识别
- C语言经典算法(七)——递归实现阶乘算法的两种方法
- c语言经典算法—求0—7 所能组成的奇数个数
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)
- C语言经典算法:冒泡排序
- C语言经典算法(二)——求最小公倍数的两种方法
- 语言经典算法100例(1-30)
- 算法竞赛入门经典第二版第一章语言篇
- C语言经典算法05
- C语言经典算法23
- C语言经典算法27-37
- C语言经典算法87-94
- 语言的学习基础,100个经典的算法
- C语言经典算法24
- 语言100个经典的算法
- NOIP基础算法与经典问题02 二维前缀和