C/C++犯二程度计算


犯二简介
测试数据
下面为此题解析:
(为了详细,篇幅可能有点长,如果不想看解析,可翻到步骤三查看源程序!)

此题可以清晰看出,这是一道对数组操作的题目。因为整型数据的范围为-32,768 ~
32767可以看出该题目要求是位数不大于100,也就是说,部分输入的数将超过整型数据的范围,若使用整型数组,无法输入负数,所以字符数组是最好的选择。

计算犯二程度我们要搞清楚,它是怎么计算得到,由题可知,

犯二程度=(二的个数/数字总数)flag1flag2(在我的程序中,flag1、flag2的初始值为1,当输入的数为负数时flag1=1.5,当为偶数是flag2=2)

步骤一

我们先要知道这个数,有多少位,有多少个’2’。
在此我们定义 int i = 0, j = 0, n = 0;//i为记录数组实际长度(包含了符号位),n为’2’的个数

提示:以下出现的i,j,n都是这个意义。
解决此问题程序如下:
int i = 0, j = 0, n = 0;
while (a[j] != '\0'//遍历数组
{i++;     //记录数组长度
if (a[j] == '2') n++;记录2的个数j++; //遍历数组各个位数}

步骤二

解决了 位数与‘2’的个数问题,那么我们要解决 该数是否为偶数,是否为负数。

当输入的数为负数时flag1=1.5,当为偶数是flag2=2是否为负数只用判断数组第一位是否为‘-’,但要注意偶数的判断,由规律可知道,若数的最后一位是偶数,则这个数就是偶数。如18514652,1564548,111116等都是偶数。 我们的数组类型为字符类型,所以还要讲每个字符数组中的字符 转化为整形数字, 方法为:(a[j-1]-‘0’) 这样得到的就是整数类型的。
举例:‘4’-‘0’=4,‘2’-‘0’=2,‘5’-‘0’=5

综上可写出 判断此数的性质以及所对应的程度倍数flag1,flag2程序如下:

if (a[0] == '-')
 { flag1 = 1.5; i--; }
 // i--是因为题目中要求 正数不记符号位
 如:123456-123456区别 前者6位,后者7if (int((a[j - 1] - '0') % 2) == 0) flag2 = 2;
//这里为何是j-1而不是j,可看遍历数组是的循环while (a[j] != '\0'),可知道最后的j位并不是数组数据 最后一位,而是'\0'。
 ss = (float(n) / float(i)) * flag1 * flag2;//计算犯二程度

步骤三

综上所述,我们可以写出最后的为完整程序:

#include <iostream>
using namespace std;
double silly(char a[]); //声明计算犯二程度的函数
int main()
{
   char s[102]; // 定义存储数值的数组int p;
   while  (cin>>p) //多次输入
      {
      cin >> s; //输入位数不大于100位的“数字” 
      double sy = silly(s); //调用函数 获取犯二的程度     
      cout << sy << endl; //输出犯二程度
      }
      return 0;
      }
      //犯二程度计算函数
      double silly(char a[])
      { int i = 0, j = 0, n = 0;
      float flag1 = 1, flag2 = 1;
      float ss = 1;
      while (a[j] != '\0') //注意!!!
      {i++;if (a[j] == '2') n++;j++;}
      if (a[0] == '-')
       {
        flag1 = 1.5; i--; 
       }
       if (int((a[j - 1] - '0') % 2) == 0) 
       flag2 = 2;
       //计算犯二程度
       ss = (float(n) / float(i)) * flag1 * flag2;
       return ss; //返回犯二程度
       }
注意上述程序中,我使用了,多次调用函数即 while (a[j] != '\0'),而有些题目是不要求,或者不需要这个的。所以可根据需要选择。编
  • 16
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沉迷学习的拿铁

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值