L1-003 个位数统计 测试点全过 c++实现

目录

正确代码

上面是参考了chatGPT的,第一次代码写失败了,以下是总结

出现警告了,原因以及如何处理


正确代码

测试点:

代码:

#include <iostream>
using namespace std;

int main()
{
    string N;
    cin >> N;
    int a[10][2] = {0};
    for (int i = 0; i < 10; i++) {
        a[i][1] = i;
    }
    int rec_ten_num = 1;
    for (int i = 0; i < N.length(); i++) {
        int num = N[i] - '0';
        a[num][0]++;
    }
    for (int i = 0; i < 10; i++) {
        if (a[i][0] != 0)
            cout << a[i][1] << ":" << a[i][0] << endl;
    }
    return 0;
}

上面是参考了chatGPT的,第一次代码写失败了,以下是总结

先上代码:

#include<iostream>
using namespace std;

int main()
{
    int N;
    cin>>N;
    int a[10][2];
    for(int i=0;i<10;i++){
        a[i][1]=i;
    }
    int rec_ten_num;
    for(int i=0,rec_ten_num=1;N%rec_ten_num>0;i++){
        a[N%rec_ten_num][2]++;
        rec_ten_num*=10;
    }
    for(int i=0;i<10;i++){
        if(a[i][2]!=0)
        cout<<a[i]<<":"<<a[i][2]<<endl;
    }
    return 0;
}

1.首先是低级失误

        定义了a[10][2],却用了a[i][2]   。用chat的话说是  “在统计数字出现的次数时,你应该使用数组 a 的第一个元素 a[i][0],而不是第二个元素 a[i][1]。”

2.其次是考虑不周

        题中说“个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。”,1000位远远超过int所能存储的最大值,应该用数组来存储。

        当时想用数组来存储的,但是考虑的比较多,比如什么时间复杂度、开辟空间大小,现在看这些完全是过滤过多,并且对length()函数不熟悉,想不起来。

3.不错的地方

        思路很清晰,从输入到输出,逻辑清晰,除了低级失误这两块没有问题,同时通过对输入输出的实现或者叫实现过程中,补充定义所需要的数据,确实无法一开始就想得很全,所以在实现过程中及时添加变量,我觉得这是不错的地方。

4. 解释

        int num = N[i] - '0';

在 ASCII 码中,字符 '0' 对应的整数是 48,而字符 '1' 对应的整数是 49,以此类推,字符 '9' 对应的整数是 57。因此,我们可以通过将字符减去字符 '0' 来得到对应的整数。

例如,如果字符串 N 中的某个字符是 '3',那么我们可以通过 N[i] - '0' 得到整数 3。这是因为字符 '3' 对应的整数是 51,字符 '0' 对应的整数是 48,所以字符 '3' 减去字符 '0' 的结果是 3。

在这个程序中,我们可以使用 N[i] - '0' 将字符串 N 中的每个字符转换为对应的整数,并将其存储在变量 num 中。然后,我们可以使用 num 来统计每个数字出现的次数。

5.解释

        

N 是一个 string 对象,是 C++ 标准库中的一个类。string 类中包含了一些成员函数,如 length(),用于获取字符串的长度。这些成员函数可以通过对象名和 . 运算符来访问。

在 C++ 中,通过点运算符(.)来访问类的成员函数或成员变量,这是一种常用的语法。在访问 string 类的成员函数时,也可以使用点运算符来访问。例如 N.length() 就是调用了 string 类的 length() 成员函数,返回字符串 N 的长度。

在这个程序中,N 是一个字符串类型的变量,用来存储输入的整数。调用 N.length() 函数可以得到字符串 N 的长度。在 for 循环中,i 的取值从 0 到 N.length() - 1,所以可以用 N[i] 来访问字符串 N 的第 i+1 个字符,也就是个位上的数字。

出现警告了,原因以及如何处理

代码过测试点啦,但有些警告a.cpp: In function ‘int main()’:

a.cpp:13:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for (int i = 0; i < N.length(); i++) {

~~^~~~~~~~~~~~

a.cpp:12:9: warning: unused variable ‘rec_ten_num’ [-Wunused-variable] int rec_ten_num = 1;

^~~~~~~~~~~

1.N 是一个 string 类型,N.length() 的返回值是 size_t 类型,应该使用 size_t 或者 unsigned int 类型的变量来接收,而不是 int 类型。因为 int 类型可能无法表示 size_t 的最大值。

2.rec_ten_num 变量未被使用,应该删除。

以下是修改的代码:

#include <iostream>
using namespace std;

int main()
{
    string N;
    cin >> N;
    int a[10][2] = {0};
    for (int i = 0; i < 10; i++) {
        a[i][1] = i;
    }
    for (size_t i = 0; i < N.length(); i++) {
        int num = N[i] - '0';
        a[num][0]++;
    }
    for (int i = 0; i < 10; i++) {
        if (a[i][0] != 0)
            cout << a[i][1] << ":" << a[i][0] << endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天写bug的屑闲鱼

请我杯饮料吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值