PTA 天梯赛 个位数统计

大家好,我是教授.F

关于这道题有很多种思路。我们首先要把输入的字符串(也就是题目的数字)存到数组中。(这里就有不同的做法。当我们把字符串存到数字后,又要怎么判断出数字出现的次数。是一个一个拿出来判断还是有其他的方法?

思路一的代码:(请根据我的思路来看代码,效果会比较好)

#include<stdio.h>
int main()
{
    int arr[10] = { 0 };
    int ch = 0;
    while ((ch = getchar()) != '\n')
    {
        arr[ch - '0'] += 1;//ch为字符变量,当ch='5'时,减去—'0'之后就会变成数字5了。
    }
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        if (arr[i] != 0)
        {
            printf("%d:%d", i, arr[i]);
            printf("\n");
        }
    }
    return 0;
}

思路一:可以将数据一个一个地输入到数组,采用while语句。并且采用getchar()函数进行接收,将                数字存到数组。

             问题:字符串怎么转换为数组中的单个数字?因为getchar()获取的都会作为字符按照格式进行读取,所以这就涉及到将字符转换为我们想要的数字。

              我们可以有这样的做法:ch - '0'; 表达式 ch - '0' 表示将字符值转换为对应的数字值。在   C、C++等编程语言中,字符 '0' 的ASCII码值通常为48,如果 ch 是一个数字字符,比如 '0', '1', '2',通过表达式 ch - '0' 可以得到对应的数字 0, 1, 2。这种方式可以方便地将字符数字转换为整数数字。

              将数据采用while语句存到数组。那这里有没有更加巧妙的点可以运用呢?如果我们只是     存到数组中,那要判断的时候还得拿出来,再判断数字出现的次数,这会显得很累赘。

              在这里我们可以先声明一个数组,大小为10的一维数组,用来判断我们数字出现的数         字?看到这里你可能有点懵,别急往下看。


              巧妙的点在于用输入的数字来定位我们声明的数组中的位置,并进行++。也就是先定义     一个大小为10的数组,如int arr[10] = { 0 };,然后输入的数字比如为:100311。编译器会  先获取1的数字,通过ch - '0'将字符1转为数字1,所以arr[ch - '0'] += 1就变成arr[ 1]+=1;    然后在arr[1]的位置进行加1,以此类推。循环后,则会出现有arr[1]的下标加三次。直接     用数组0~9的位置上的值进行输出。
 输出的时候,先判断数组中的第i个元素是否为零,不为零就输出。

              对于这道题,主要是明白如何用一个空白的数组来统计数字出现的次数。输入的数字定     位到数组的位置,在改位置进行+1,直接省略了将数字从数组拿出来一一判断的步骤了。

思路二的代码:

#include<stdio.h>
int main()
{
    char n[1001] = { "\0" };
    char* p = n;
    int i, num[10] = { 0 };
    scanf_s("%s", n, (unsigned)sizeof(n));
    while (*p != '\0')//判断是否为空字符
    {
        num[*p - '0']++;
        p++;
    }
    for (i = 0; i < 10; i++)
    {
        if(num[i] != 0)
        {
            printf("%d:%d\n", i, num[i]);
        }
    }
    return 0;
}

思路二:

           这里采用的是使用指针和确定的字符串来完成  ,但是跟第一思路的方法很相似。不过有一  点要提一下!

           ***为什么我不用scanf_s("%d",&n;)而是用scanf_s("%s", n, (unsigned)sizeof(n));

           在这里,`(unsigned)sizeof(n)` 的作用是获取字符数组 `n` 的大小,并将其转换为无符号整   数类型。

          为什么要转为无符整数类型呢?

                这是因为scanf_s函数需要的参数类型为无符号整数型。         

          为什么要获取字符数组的n的大小呢?

             一: scanf_s("%s",&n);会导致没有为格式字符串传递足够的参数,也就是scanf_s`函数需   要指定要读取的字符串的大小,而我们之前未正确指定大小参数,可能导致读取字符串超出了数组的界限,并发生了缓冲区溢出的问题。
                                  

            二: 使用 `scanf_s` 函数时,应该将要填充的字符数组直接作为参数传递,而不是使用       `&`取地址操作符。因为数组名本身就是数组的地址,所以不需要使用 `&` 取地址操作   符来获取数组的地址。

          知识点:
                   (unsigned)` 是一种强制类型转换操作符,它将后面的值转换为无符号整数类型。
 这个操作符确保了在使用 `%s` 格式符读取字符串时,`sizeof(n)` 返回的大小将被正确   地传递给 `scanf_s` 函数。由于 `scanf_s` 函数需要传递给它的大小参数是无符号整数  类型,因此我们使用 `(unsigned)` 来确保将返回的大小值转换为正确的类型。

   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值