犯二的程度

任务描述

本关任务:编写函数 silly,计算整数(不多于100位)犯二的程度并返回。

数字也可以“犯二”,一个整数“犯二的程度”定义为:该数字中包含2的个数与其位数的比值,如果这个整数是负数,则程度增加0.5倍,如果还是个偶数,则再增加1倍。

例如,数字−56782223456是个11位数,其中有3个2,是负数,也是偶数,则它的犯二程度为:3/11×1.5×2,约为0.818182。

相关知识

由于 C 和 C++ 中 int 类型的表示范围有限,为−2147483648~2147483647,所以超过10位的整数就会溢出。

例如下面的程序:

 
  1. int a;
  2. cin >> a;
  3. cout << a << endl;

测试输入:77777777777

输出结果:-858993460

很显然整型变量 a 无法表示超出范围的数。

字符串数组

在 C 和 C++ 中,一个字符串就是用一对双引号括起来的一串字符。字符串的存储是利用一维字符数组来实现的,该字符数组的长度为待存字符串的长度加1。即如果一个字符串的长度为 n ,则用于存储该字符串的数组的长度应为 n+1。

当字符串存入数组时,是把每个字符依次存入到数组的对应元素中,即把第一个字符存入到下标为0的元素中,第二个字符存入到下标为1的元素中,依次类推,最后会把一个空字符 ′\0′ 存入到下标为 n 的元素中(这里假定字符串的长度为 n)。字符存储的是它的 ASCII 码或区位码。

例如用一维字符数组 a[12] 来存储字符串 ″Strings.\n″ 时,数组 a 中的内容参见下图:

接下来,我们可以利用字符串来初始化字符数组,如:

 
  1. char a[10] = ″array″;
  2. char b[20] = ″This is a pen. ″;
  3. char c[8] = ″″;
  • 第一条语句定义了字符数组 a[10] 并被初始化为“array”,其中 a[0] ~ a[5] 元素的值依次为字符‘a’, ‘r’,‘r’,‘a’,‘y’和‘\0’;

  • 第二条语句定义了字符数组 b[20] ,其中 b[i] 元素( 0 ≤ i ≤ 13 )被初始化为所给字符串中的第 i+1 个字符,b[14] 被初始化为字符串结束标志符‘\0’;

  • 第三条语句定义了一个字符数组 c[8] 并初始化为一个空串,此时它的每个元素的值均为‘\0’。

我们可以看到对于字符串而言,它的存储总是以 '\0' 结尾。

例如下面的程序可以计算并输出字符串的长度:

 
  1. char s[1000]; // 定义一维字符数组
  2. cin >> s; // 输入一个字符串存入字符数组s中
  3. int i = 0;
  4. // 逐个判断字符数组的某一位是否是'\0',该字符意味着字符串的结束
  5. while(s[i] != '\0')
  6. i++;
  7. cout << i << endl; // 输出字符串的长度

获取字符对应的整数

由于使用字符形式存储数字时,存储的是数字对应的 ASCII 码,由于在 ASCII 码表中字符‘0’到字符‘9’是连续存放的,所以下面的程序可以获得字符对应的数字:

 
  1. char c = '2'; // c 中存储的是字符 '2' 的ASCII码
  2. int k = c - '0'; // k 即为字符 '2' 对应的整数 2

编程要求

在右侧编辑器中的Begin-End之间补充代码,计算整数(不多于100位,数据由平台提供)犯二的程度并返回。具体“犯二的程度”定义如下:

  1. 该数字中包含 2 的个数与其位数的比值;

  2. 如果整数是负数,则程度增加 0.5 倍;

  3. 如果整数是偶数,则再增加 1 倍。

提示:对于本关要求计算不超过100位的整数,很显然不能使用 int 类型,但可以把输入的一串数字当做字符串处理,使用字符数组来接收输入的整数。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:-13142223336 预期输出:0.818182

测试输入:122335468912334612 预期输出:0.444444

 程序:

#include <iostream>
using namespace std;

// 函数silly:计算数值有多二
// 参数:a-存储数值的字符数组,以'\0'结束,所以不需要另一个参数告诉函数数组有多长
// 返回值:数值犯二的程度
double silly(char a[]);

int main()
{
    char s[102];     // 定义存储数值的数组
    cin >> s;     // 输入不超过位的整数
    double sy = silly(s);     // 计算犯二的程度
    cout << sy << endl;     // 输出犯二的程度
    return 0;
}

double silly(char a[])
{
    // 请在此添加代码,实现函数silly
    /********** Begin *********/
    int i = 0, j = 0;
    while (a[i] != '\0')
    {
        if (a[i] == '2')    /* 如果此元素为 '2', 那么将它的数量记录下来 */
        {
            j++;
        }
        i++;
    }
    if (a[0] == '-')      /* 如果为负数,就将负号占用的位数删去 */
        i--;
    double x = (double) j / i;    /* 使用强制转换将两个整型变量相互计算的值变为双精度类型 */
    int c = a[i] - '0';
    if (c % 2 == 0)
        x = x * 2;
    if (a[0] == '-')
        x = x * 1.5;
    return x;
    
    /********** End **********/
}

 

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值