一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是_C++犯二程度的计算...

4b7d52db554ed59e906d85b75d6f52dd.png

e6aaf3f263283818bdb5c10844fdff0c.png
此图为两个测试结果,可用于自行测试

下面为此题解析:

(为了详细,篇幅可能有点长,如果不想看解析,可翻到步骤三查看源程序!)

此题可以清晰看出,这是一道对数组操作的题目。因为整型数据的范围为-32,768 ~ 32767

可以看出该题目要求是位数不大于100,也就是说,部分输入的数将超过整型数据的范围,若使用整型数组,无法输入负数,所以字符数组是最好的选择。

计算犯二程度我们要搞清楚,它是怎么计算得到,由题可知,犯二程度=(二的个数/数字总位数)*flag1*flag2(在我的程序中,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

是否为负数只用判断数组第一位是否为‘-’,但要注意偶数的判断,由规律可知道,若数的最后一位是偶数,则这个数就是偶数。如185164652,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位,后者7位

if (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'),而有些题目是不要求,或者不需要这个的。所以可根据需要选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值