C语言经典算法100例(二)

时间:2021-09-29 21:23:43

11.判断某一年是否是闰年。

//判断某一年份是否是闰年
int IsLeapYear(int year)
{
return (year % 400 == 0 || (year % 4 == 0) && (year % 100 != 0));
}

运行结果:

C语言经典算法100例(二)

12.获得某年、某月的最大天数。

//获得某年、某月的最大天数
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;
}
}

运行结果:

C语言经典算法100例(二)

13.输入某年某月某日,判断这一天是这一年的第几天?

//输入某年某月某日,判断这一天是这一年的第几天?
/*
程序分析:以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;
}

运行结果:

C语言经典算法100例(二)

更多关于日期的算法,请参见我的博客《关于日期的常用算方法》(java版)。

14.求一个数的阶乘。

//递归求阶乘
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;
}

运行结果:

C语言经典算法100例(二)

这里求得的阶乘只能是较小数的阶乘,想求得200或更大数的阶乘就无能无力了,所以必须通过其他的算法来实现。

关于更大数的阶乘,大家可以参见我的博客《大数阶乘的实现

15.求两个数的最大公约数和最小公倍数。

//求两个数的最大公约数
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);
}

运行结果:

C语言经典算法100例(二)

16.打印出三位的"水仙花数",所谓"水仙花数"是指一个N位数,其各位数字立方和等于该数。

//打印出三位的"水仙花数",所谓"水仙花数"是指一个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);
}
}

运行结果:

C语言经典算法100例(二)

大家还可以考虑一下,如何打印21位“水仙花”数? (基本思想和《大数阶乘的实现》及《求任意位数的Pi》的思想相同,即用数组存储)。

17.不依赖第三个变量,实现两个整数交换。

/不依赖第三个变量,实现两个整数交换
//第一种方法
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;
}

运行结果:

C语言经典算法100例(二)
18.将10进制的数转换为2-16进制。

//将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"); }

运行结果:

C语言经典算法100例(二)
19.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

//将一个正整数分解质因数。例如:输入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); }

运行结果:

C语言经典算法100例(二)

20.猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。

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语言经典算法100例(二)

转载请标明出处:http://blog.csdn.net/u012027907/article/details/12720357

C语言经典算法100例(二)的更多相关文章

  1. C语言经典算法100例

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  2. C语言经典算法100例(一)

    C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的.更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础. ...

  3. C语言经典算法100例(三)

    1.河内之塔 说明河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家 Edoua ...

  4. C语言经典程序100例

    -------------------------------------------------------------------------------- [程序1] 题目:古典问题:有一对兔子 ...

  5. C语言经典例题100

    C语言经典例题100 来源 http://www.fishc.com 适合初学者 ----------------------------------------------------------- ...

  6. C语言经典算法 - 多维矩阵转一维矩阵的代码

    下边内容内容是关于C语言经典算法 - 多维矩阵转一维矩阵的内容,应该能对码农也有好处. #include <stdio.h>#include <stdlib.h>int mai ...

  7. C语言经典程序190例

    [程序1] 题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数.求??代表的两位数,及809*??后的结果. 1.程序分析: 2.程序 ...

  8. JAVA 经典算法 40 例

    [程序 1] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列 ...

  9. C语言 经典编程100

    一.题目 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件 ...

随机推荐

  1. &lpar;转&rpar;Redis 的 5 个常见使用场景

    在这篇文章中,我们将阐述 Redis 最常用的使用场景,以及那些影响我们选择的不同特性. 1.会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cac ...

  2. Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作

    Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操作,使得我们不再为Oracle本身丑陋.难用的UI而抱怨.由于我们一般 ...

  3. 使用nginx lua实现网站统计中的数据收集

    导读网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于ja ...

  4. 小米Java程序员第二轮面试10个问题,你是否会被刷掉?

    近日,开发者头条上分享了一篇"小米java第二轮面经",有很多的java程序员表示非常有兴趣. 下面l就和各位分享小米java第二轮面经(华为java工程师笔试面试题可以看文章某尾 ...

  5. 《ASP&period;NET Core In Action》读书笔记系列三 ASP&period;NET Core如何处理请求的?

    在本节中,您将看到ASP.NET Core应用程序如何运行的,从请求URL开始到页面呈现在浏览器中. 为此,您将看到 一个HTTP请求在Web服务器中是如何被处理的.ASP.NET Core如何扩展该 ...

  6. 20155219付颖卓《网络攻防》Exp4 恶意代码分析

    一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 可以用window7自带的schtasks ...

  7. Swift真机调试时报错dyld&colon; Library not loaded&colon; &commat;rpath&sol;libswiftCore&period;dylib

    dyld: Library not loaded: @rpath/libswiftCore.dylib Referenced from: /private/var/mobile/Containers/ ...

  8. 酷炫的SVG 动态图标

                                                      在  loading.io 上能看到好多效果惊艳的loading图标.它们都是用svg写成的,寥寥几 ...

  9. 事务 — Redis 设计与实现

    非事务状态下的命令以单个命令为单位执行,前一个命令和后一个命令的客户端不一定是同一个: 事务状态则是以一个事务为单位,执行事务队列中的所有命令:除非当前事务执行完毕,否则服务器不会中断事务,也不会执行 ...

  10. 自然语言处理--Word2vec(一)

    一.自然语言处理与深度学习 自然语言处理应用 深度学习模型                       为什么需要用深度学习来处理呢 二.语言模型 1.语言模型实例: 机器翻译 拼写纠错        ...