1.基础实践题
4.1. 显示数字出现次数
4.1.1题目内容
输 入 一 个 十 进 制 正 整 数 , 转 换 成 16 进 制 数 。 再 输 入 一 个 数
(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f),统计这个数出现的次数。
【输入格式】
一行输入十进制正整数。 另一行输入要统计的数。
【输出格式】
要统计的数出现的次数。
【输入样例】
在这里给出一组输入。例如:
84117512
8
【输出样例】
3
4.1.2设计思想
(描述程序设计总体思路,并配流程图+文字说明,测试截图及说明)

4.1.3核心代码:
#include
#include
int main()
{
int a,sum=0,c[100],d,e=0,i=0;
char N[100],m;//定义一个名为N的字符数组,长度为100;定义一个字符型变量m
printf("请输入一个十进制正整数:\n");
scanf("%d",&a);
if(a>=0&&a<10)
{
N[i]='0'+a;//判断输入的数在0~9的情况(我们知道,N[i]是数字字符,减去字符0的ASCLL(即’0’),正好可以变成整形的 0,1,2.......9)
printf("%c",N[i]);
}
else if(a>=10&&a<16)
{
N[i]='A'+a-10;//
printf("%c",N[i]);
}//判断输入的数在10~15的情况
else
{
for(i=0;a>0;i++)//开始16以上的数
for(i=0;a>0;i++)//开始16以上的数的转换
{
c[i]=a%16;//记录每次除以16的余数
a=a/16;
if(c[i]>=10&&c[i]<=15)//若是在10~15之间转换A~F之间所对应的字符
N[i]='A'+c[i]-10;
else if(c[i]>=0&&c[i]<10)//若是在0~9之间则保留原来的数字
N[i]='0'+c[i];
sum=i+1;
}
for(d=sum-1;d>=0;d--)//输出10转16进制的结果
printf("%c",N[d]);
printf("\n");
}
printf("请输入要查找的数:\n");//查找要查找的数
scanf("%c",&m);
scanf("%c",&m);//回车要消耗一次输入,所以多打一个scanf
for(d=0;d<=sum-1;d++)
if(m==N[d])
e++;
printf("要查找的数共出现的次数:\n");
printf("%d\n",e);
return 0;
}
运行结果:

4.1.4算法分析:
(分析程序的总体算法复杂度及核心代码复杂度 O(?))
4.2. 显示 Pascal 三角形
4.2.1题目内容
输入行数 n,显示 n 行 Pascal 三角形。数字间有一个空格。每行最后一个数字后
有一个空格。
【输入格式】
在一行中输入行数 n。
【输出格式】
输出 n 行 Pascal 三角形。
【输入样例】
在这里给出一组输入。例如:
4
【输出样例】
在这里给出相应的输出。例如:
1
1 1
1 2 1
1 3 3 1
4.2.2设计思想
(描述程序设计总体思路,并配流程图+文字说明,测试截图及说明)

杨辉三角有两个规律,首先杨辉三角的每一行都以“1”作为开头及结束,第二,就是三角形的每个数字等于它肩上两个数字相加。
4.2.3核心代码:
#include
#include
void yanghui(int);
#define N 35
int main()
{
int n;
printf("请输入所求的Pascal三角形的行数:\n");
scanf("%d",&n);
yanghui(n);
return 0;
}
void yanghui(int n)
{
int i,j,a[N][N];
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
{
if(j==0||i==j)a[i][j]=1;
else a[i][j]=a[i-1][j]+a[i-1][j-1];
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
if(j!=i)
printf(" %d",a[i][j]);
else printf(" %d",a[i][j]);
}
printf("\n");
}
}
运行结果:

4.2.4算法分析:
(分析程序的总体算法复杂度及核心代码复杂度 O(?))
4.3. 计算到任意日期的总天数
4.3.1题目内容
编程序实现:输入任意一个日期的年、月、日的值,求出从公元 1 年 1 月 1 日
到该日期前一年的年末总共有多少天,到该日期前一个月的月末总共有多少天,
到这一天总共有多少天。假定从公元第一天开始,就实施格里高利历法。格里高
利历法的置闰规则是 400 年 97 闰,也可以概括为:四闰百不闰,四百闰。
【输入格式】
输入三个代表年、月、日的正整数,以空格分隔。
【输出格式】
输出三个总天数,数据之间以换行符分隔,最后换行。
【输入样例】
2012 3 29
【输出样例】
734502
734562
734591
4.3.2设计思想
(描述程序设计总体思路,并配流程图+文字说明,测试截图及说明)

4.3.3核心代码
#include
int main(){
int year,month,day;//输入的年月日
int sum_1=0,sum_2=0,sum_3;//分别代表要求的天数与星期
int i,j;
int common_year[12]={
31,28,31,30,31,30,31,31,30,31,30,31};//平年每个月的天数
//获取年月日格式 2015/4/16,2015 4 16,2015 $4 &l6 等等中间只要有两个分隔符就行。
scanf("%d",&year);
getchar();
scanf("%d",&month);
getchar();
scanf("%d",&day);
//计算到前一年的年末的天数
for(i=1;i<year;i++){
if((i%4==0&&i%100!=0)||i%400==0){
//闰年
sum_1+=366;
}else{
//平年
sum_1+=365;
}
}
printf("前一年的年末:%d\n",sum_1);
//计算前一个月末的天数
if(month<=1){
//一月份,相当于去年年末
sum_2=sum_1;
}else if(month<=2){
//2月份
sum_2=sum_1+31;
}else if(month>2){
//大于2月份须判断,闰年还是平年。
if((i%4==0&&i%100!=0)||i%400==0){
//平年2月29天。
common_year[1]=29;
}
//本年月的天数
for(j=0;j<month-1;j++){
sum_2+=common_year[j];
}
sum_2+=sum_1;
}
printf("前一月末天数:%d\n",sum_2);//月末加本月天数,就是总天数。
sum_3=sum_2+day;
printf("到这一天总共有:%d\n",sum_3);//求星期几,公元一月一日是星期一(虽然公元元年一月一日是星期几的问题有争论。但这个题不是考你们历法的问题,当星期一用就行,或者把问题摔给出题的人,让他证明一下历法是连续的,一天没落的)。
return 0;
}
运行结果:

4.3.4算法分析
(分析程序的总体算法复杂度及核心代码复杂度 O(?))
4.4. 字符统计
4.4.1题目内容
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
【输入格式】
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中
任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。
【输出格式】
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。
如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写
字母。
【输入样例】
This is a simple TEST. There ARE numbers and other symbols 1&2&3…
【输出样例】
e 7
4.4.2设计思想
(描述程序设计总体思路,并配流程图+文字说明,测试截图及说明)
方法:默认第一个字符为出现次数最多的字符,然后用后面的字符与他做比较,如果字符个数大于当前字符,则继续判断是否为小写字母,如果满足,则将字符替换,以及字符次数替换。 如果字符次数相同,则比较当前字符出现的次数和max的大小,然后再做替换。

4.4.3核心代码
#include
int main(void)
{
int a[