为什么这个代码算不出正确答案?

#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

如有帮助,请采纳一下,谢谢。