犯二的程度

犯二的程度

任务描述

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

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

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

编程要求

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

  1. 该数字中包含 2 的个数与其位数的比值;
  2. 如果整数是负数,则程度增加 0.5 倍;
  3. 如果整数是偶数,则再增加 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 **********/
}
posted @ 2020-04-13 15:54  碎了的冰  阅读(2707)  评论(16编辑  收藏  举报