下面为此题解析:
(为了详细,篇幅可能有点长,如果不想看解析,可翻到步骤三查看源程序!)
此题可以清晰看出,这是一道对数组操作的题目。因为整型数据的范围为-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'),而有些题目是不要求,或者不需要这个的。所以可根据需要选择。