任务描述
本关任务:编写函数 silly,计算整数(不多于100位)犯二的程度并返回。
数字也可以“犯二”,一个整数“犯二的程度”定义为:该数字中包含2的个数与其位数的比值,如果这个整数是负数,则程度增加0.5倍,如果还是个偶数,则再增加1倍。
例如,数字−56782223456是个11位数,其中有3个2,是负数,也是偶数,则它的犯二程度为:3/11×1.5×2
,约为0.818182。
相关知识
由于 C 和 C++ 中 int 类型的表示范围有限,为−2147483648~2147483647,所以超过10位的整数就会溢出。
例如下面的程序:
int a;
cin >> a;
cout << a << endl;
测试输入:77777777777
输出结果:-858993460
很显然整型变量 a 无法表示超出范围的数。
字符串数组
在 C 和 C++ 中,一个字符串就是用一对双引号括起来的一串字符。字符串的存储是利用一维字符数组来实现的,该字符数组的长度为待存字符串的长度加1。即如果一个字符串的长度为 n ,则用于存储该字符串的数组的长度应为 n+1。
当字符串存入数组时,是把每个字符依次存入到数组的对应元素中,即把第一个字符存入到下标为0的元素中,第二个字符存入到下标为1的元素中,依次类推,最后会把一个空字符 ′\0′ 存入到下标为 n 的元素中(这里假定字符串的长度为 n)。字符存储的是它的 ASCII 码或区位码。
例如用一维字符数组 a[12] 来存储字符串 ″Strings.\n″ 时,数组 a 中的内容参见下图:
接下来,我们可以利用字符串来初始化字符数组,如:
char a[10] = ″array″;
char b[20] = ″This is a pen. ″;
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' 结尾。
例如下面的程序可以计算并输出字符串的长度:
char s[1000]; // 定义一维字符数组
cin >> s; // 输入一个字符串存入字符数组s中
int i = 0;
// 逐个判断字符数组的某一位是否是'\0',该字符意味着字符串的结束
while(s[i] != '\0')
i++;
cout << i << endl; // 输出字符串的长度
获取字符对应的整数
由于使用字符形式存储数字时,存储的是数字对应的 ASCII 码,由于在 ASCII 码表中字符‘0’到字符‘9’是连续存放的,所以下面的程序可以获得字符对应的数字:
char c = '2'; // c 中存储的是字符 '2' 的ASCII码
int k = c - '0'; // k 即为字符 '2' 对应的整数 2
编程要求
在右侧编辑器中的Begin-End
之间补充代码,计算整数(不多于100位,数据由平台提供)犯二的程度并返回。具体“犯二的程度”定义如下:
-
该数字中包含 2 的个数与其位数的比值;
-
如果整数是负数,则程度增加 0.5 倍;
-
如果整数是偶数,则再增加 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, num = 0, allNum = 0;
if (a[0] == '-')i = 1;
while (a[i] != '\0')
{
allNum++;
if (a[i] == '2') num++;
i++;
}
double sum = (double)num / allNum;
if (a[0] == '-')
{
allNum++;
sum = (double)sum*1.5;
}
if (a[allNum - 1] % 2 == 0)sum = (double)sum*2;
return sum;
/********** End **********/
}