#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
#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;
int k=0;
int j=0;
double t;
while(a[k]!='\0'){
k++;}
k=k;
//cout<<k<<endl;
for(i=1;i<=k;i++){
if(a[i]=='2'){
j=j+1;}}//cout<<j<<endl;
j=j;
if(a[0]!='-'){
if(a[k]%2==0){
t=(double)j/(k-1)*3.0;
//return t;
cout<<t<<endl;
}else{t=(double)j/(k-1)*1.0;
//return t;
cout<<t<<endl;
}
}else{
if(a[k]%2==0){
t=(double)j/k*2.0;
//return t;
cout<<t<<endl;
}else{
t=(double)j/k*1.0;
//return t;
cout<<t<<endl;
}
}
system("pause");
return 0;
/********** End **********/
}
本关任务:编写函数 silly,计算整数(不多于100位)犯二的程度并返回。 数字也可以“犯二”,一个整数“犯二的程度”定义为:该数字中包含2的个数与其位数的比值,如果这个整数是负数,则程度增加0.5倍,如果还是个偶数,则再增加1倍。 例如,数字−56782223456是个11位数,其中有3个2,是负数,也是偶数,则它的犯二程度为:3/11×1.5×2,约为0.818182。
一是好像没有考虑a[0]='2'的情况
二是
if(a[k]%2==0){
t=(double)j/(k-1)*3.0;====为什么这里要乘以3呢?偶数只是增加一倍啊;当为负数时,后面else部分也应该乘以1.5啊
三是倍数的问题,负数增加0.5倍,偶数再增加一倍,这里的倍数因该针对前面的2的数量除以所有位数的比值,因此负数+偶数应该是3/11*(1+0.5+1),而不是3/11*1.5*2
k是字符的长度,但是下标是从0~k-1,所以你在for(i=1;i<=k;i++)这里是错误的,应该是for(i=1;i<k;i++)。而且a[k]是‘\0’,所以你下面的不应该是a[k]%2,而应该是a[k-1]%2
如有帮助,请采纳一下,谢谢。