犯二的程度
任务描述
本关任务:编写函数 silly,计算整数(不多于100100位)犯二的程度并返回。
数字也可以“犯二”,一个整数“犯二的程度”定义为:该数字中包含22的个数与其位数的比值,如果这个整数是负数,则程度增加0.50.5倍,如果还是个偶数,则再增加11倍。
例如,数字-56782223456−56782223456是个1111位数,其中有33个22,是负数,也是偶数,则它的犯二程度为:3/11×1.5×2
,约为0.8181820.818182。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,计算整数(不多于100100位,数据由平台提供)犯二的程度并返回。具体“犯二的程度”定义如下:
- 该数字中包含 2 的个数与其位数的比值;
- 如果整数是负数,则程度增加 0.5 倍;
- 如果整数是偶数,则再增加 1 倍。
测试样例
测试输入:-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,len,count_2=0,judge_np,judge_even;
double result;
//手动计算字符串长度
i=0;
while(a[i]!='\0')i++;
len = i;
//统计有几个2
for(i=0;i<len;i++){
if(a[i]=='2'){
count_2++;
}
}
//判断是否是负数
if(a[0]=='-'){
judge_np=1;
}else{
judge_np=0;
}
//判断是否是偶数
if(a[len-1]%2==0){
judge_even=1;
}else{
judge_even=0;
}
// cout<<"字符串:"<<a<<endl;
// cout<<"是否是负数"<<judge_np<<endl;
// cout<<"是否是偶数"<<judge_even<<endl;
// cout<<"有几个2"<<count_2<<endl;
// cout<<"长度"<<len<<endl;
//计算结果
if(judge_np)len--;
result = 1.0*count_2/len;
if(judge_np)result*=1.5;
if(judge_even)result*=2;
return result;
/********** End **********/
}
来源:oschina
链接:https://my.oschina.net/u/4407314/blog/4286124