1、统计个位数字
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
裁判测试程序样例:
#include <stdio.h>
int Count_Digit ( const int N, const int D );
int main()
{
int N, D;
scanf("%d %d", &N, &D);
printf("%d\n", Count_Digit(N, D));
return 0;
}
/* 你的代码将被嵌在这里 */
函数代码:
int Count_Digit(const int N,const int D)
{
int num[10]={0};
int n=N;
if(n<0){
n=-n;
}
if(n==0){
num[0]=1;
}
while (n){ //提取每一位数字,并计数
num[n%10]++;
n/= 10;
}
return num[D];
}
ps:此题需考虑N为负的情况,N为负数时可将其转变为正数,再进行每一位的数据提取。
2、求单链表结点的阶乘和
本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;
struct Node {
int Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
int FactorialSum( List L );
int main()
{
int N, i;
List L, p;
scanf("%d", &N);
L = NULL;
for ( i=0; i<N; i++ ) {
p = (List)malloc(sizeof(struct Node));
scanf("%d", &p->Data);
p->Next = L; L = p;
}
printf("%d\n", FactorialSum(L));
return 0;
}
/* 你的代码将被嵌在这里 */
函数代码:
int FactorialSum(List L)
{
int sum=0;
int num;
while (L!= NULL){// 因为无头结点,所以while循环结束条件为L==null
for (num = 1 ;L->Data > 0 ;L->Data--) //num每次必须重新设为1
num*= L->Data;
sum+= num;//加上一个节点的阶乘值
L = L->Next;//前往下一个节点
}
return sum;//所有节点遍历完成,返回阶乘和
}
ps:由给出的main函数中链表创建过程可知,该链表无头结点,头指针直接指向第一个结点。
3、使用函数输出水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。
裁判测试程序样例:
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
函数代码:
int pow(int x, int n)
{
int a= 1;
for (int i = 0; i < n; i++)
a*= x; //求x的n次方的操作
return a;
}
int narcissistic(int number)//判断是否是水仙花数
{
int n=0, count=0, a[5],i=0;//num最大5位
int num=number;
while (number>0) {
a[i]=number%10;
i++;
count++;//记录位数
number/= 10;
}
for (int i=0; i<count; i++)
n+=pow(a[i], count);
if (n==num)
return 1;
return 0;
}
void PrintN(int m, int n)//打印开区间(m, n)内所有的水仙花数
{
for (int i=m+1; i<n; i++)
if (narcissistic(i))
printf("%d\n", i);
}
ps:判断是否水仙花数关键在于提取number的每一位数据,并记录number的位数N,再计算每位数的N次方之和,最后判断是否与number本身相等。
另外提取一个数字每一位的数据的方法经常被用到(题1也用到了),应熟悉该种方法的思想。
4、分类统计字符个数
本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 15
void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
/* Your function will be put here */
函数代码:
void StringCount(char s[])
{
int letter = 0, blank = 0, num = 0, other = 0;
int i = 0;
do
{
if (s[i] == ' ' || s[i] == '\n')
blank++;
else if (s[i] >= 'a' && s[i] <= 'z'|| s[i] >= 'A' && s[i] <= 'Z')
letter++;
else if (s[i] >= '0' && s[i] <= '9')
num++;
else
other++;
i++;
}while(s[i] != '\0');
printf("letter = %d, blank = %d,num = %d, other = %d", letter, blank, num, other);
}
ps:可通过字符串结尾为‘\0’再加上do-while循环来遍历字符串,也可添加string.h头文件,使用strlen函数来获取字符串长度,进而采用for循环来遍历。
另外字符串相关知识点还需要加强。
5、使用函数求特殊a串数列和
给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。
函数接口定义:
int fn( int a, int n );
int SumA( int a, int n );
其中函数fn须返回的是n个a组成的数字;SumA返回要求的和。
裁判测试程序样例:
#include <stdio.h>
int fn( int a, int n );
int SumA( int a, int n );
int main()
{
int a, n;
scanf("%d %d", &a, &n);
printf("fn(%d, %d) = %d\n", a, n, fn(a,n));
printf("s = %d\n", SumA(a,n));
return 0;
}
/* 你的代码将被嵌在这里 */
函数代码:
int fn( int a, int n )
{
int num=0;
for(int i = 0; i < n; i++)
num = (num*10)+a;
return num;
}//求n个a的数
int SumA( int a, int n )
{
int sum = 0;
for(int i = 1; i <= n; i++)
sum += fn(a, i);
return sum;
}
总结:今天练习了一些C语言基础编程,并回忆了链表的相关知识,练习了一道链表的基础题,明日计划完成递归题型以及链表相关题目的练习。