C语言(一)

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语言基础编程,并回忆了链表的相关知识,练习了一道链表的基础题,明日计划完成递归题型以及链表相关题目的练习。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值