犯二的程度
任務描述
本關任務:編寫函數 silly,計算整數(不多於100100位)犯二的程度並返回。
數字也可以“犯二”,一個整數“犯二的程度”定義為:該數字中包含22的個數與其位數的比值,如果這個整數是負數,則程度增加0.50.5倍,如果還是個偶數,則再增加11倍。
例如,數字-56782223456−56782223456是個1111位數,其中有33個22,是負數,也是偶數,則它的犯二程度為:3/11×1.5×2
,約為0.8181820.818182。
編程要求
在右側編輯器中的Begin-End
之間補充代碼,計算整數(不多於100100位,數據由平台提供)犯二的程度並返回。具體“犯二的程度”定義如下:
- 該數字中包含 2 的個數與其位數的比值;
- 如果整數是負數,則程度增加 0.5 倍;
- 如果整數是偶數,則再增加 1 倍。
測試樣例
測試輸入:-13142223336
預期輸出:0.818182
測試輸入:122335468912334612
預期輸出:0.444444
源代碼
#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,len,count_2=0,judge_np,judge_even;
double result;
//手動計算字符串長度
i=0;
while(a[i]!='\0')i++;
len = i;
//統計有幾個2
for(i=0;i<len;i++){
if(a[i]=='2'){
count_2++;
}
}
//判斷是否是負數
if(a[0]=='-'){
judge_np=1;
}else{
judge_np=0;
}
//判斷是否是偶數
if(a[len-1]%2==0){
judge_even=1;
}else{
judge_even=0;
}
// cout<<"字符串:"<<a<<endl;
// cout<<"是否是負數"<<judge_np<<endl;
// cout<<"是否是偶數"<<judge_even<<endl;
// cout<<"有幾個2"<<count_2<<endl;
// cout<<"長度"<<len<<endl;
//計算結果
if(judge_np)len--;
result = 1.0*count_2/len;
if(judge_np)result*=1.5;
if(judge_even)result*=2;
return result;
/********** End **********/
}