#6922: [簡答] divide and conquer


saitor362320 (Kira Yamato)


本題可以先做1~4的數字。 EX: 1234

其他大於4位數的數字就可以拆開依序帶入function即可

EX: 1234,5678,9001

可分成3部分依序去解

1234

5678

9001

最後合併就可以了微笑

 

[簡答]:

#include <stdio.h>

#include <iostream>

#include <string.h>

 

using namespace std;

 

char* digit[6] = {"","拾","佰","仟","萬","億"};

char* text[10]  = {"零","壹","貳","參","肆","伍","陸","柒","捌","玖"};

 

bool BaseMath(char*num)

{

bool lastNumIsZero = false;

 

int numLen = strlen(num);

if(numLen > 4){cout << "ERROR" << endl; return false;}

 

 

if(numLen == 4){

if(num[0] == '0' && num[1] == '0'&& num[2] == '0' && num[3] == '0')

return false;

}

 

for(int i=0; i<numLen ; ++i){

 

if(num[i] == '0'){

bool remainIsZero = true;

for(int j=i+1 ; j < numLen ; ++j){

if(num[j] != '0') remainIsZero = false;

}

if(!lastNumIsZero && !remainIsZero) cout << text[0];

lastNumIsZero = true;

}

if(num[i] != '0'){ 

lastNumIsZero = false;

 

int tindex = num[i] -'0';

int dindex = numLen-i-1;

cout << text[tindex]

   << digit[dindex];

}

}

return true;

}

 

void SplitMath(char* num)

{

int numLen = strlen(num);

 

if(numLen < 5){

BaseMath(num);

cout << endl;

}else if(numLen < 9){

char M_Math[5];

char L_Math[5];

int mindex = numLen - 4;

int i=0;

for(i ; i<mindex ; ++i ){

M_Math[i] = num[i];

}M_Math[i] = '\0';

 

strcpy(L_Math,&num[mindex]);

 

if(BaseMath(M_Math))

cout << digit[4];

BaseMath(L_Math);

cout << endl;

}else if(numLen < 13){

char B_Math[5];

char M_Math[5];

char L_Math[5];

int bindex = numLen - 8;

int mindex = numLen - 4;

int i=0;

for(i ; i<bindex ; ++i ){

B_Math[i] = num[i];

}B_Math[i] = '\0';

int j=bindex;

int k = 0;

for(j,k ; j<mindex ; ++j, ++k ){

M_Math[k] = num[j];

}M_Math[k] = '\0';

 

strcpy(L_Math,&num[mindex]);

 

if(BaseMath(B_Math))

cout << digit[5];

if(BaseMath(M_Math))

cout << digit[4];

BaseMath(L_Math);

cout << endl;

}

 

}

 

int main()

{

char str[101];

 

while(cin >> str){

SplitMath(str);

}

 

return 0;

#6923: Re:[簡答] divide and conquer


saitor362320 (Kira Yamato)


/**********************************************************************************/
/*  Problem: a008 "中文大寫數字"                                            */
/*  Language: CPP (1986 Bytes)                                                    */
/*  Result: AC(4ms, 364KB) judge by this@ZeroJudge                                */
/*  Author: saitor362320 at 2012-08-20 19:04:39                                   */
/**********************************************************************************/


#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

char* digit[6] = {"","拾","佰","仟","萬","億"};
char* text[10]  = {"零","壹","貳","參","肆","伍","陸","柒","捌","玖"};

bool BaseMath(char*num)
{
bool lastNumIsZero = false;

int numLen = strlen(num);
if(numLen > 4){cout << "ERROR" << endl; return false;}


if(numLen == 4){
if(num[0] == '0' && num[1] == '0'&& num[2] == '0' && num[3] == '0')
return false;
}

for(int i=0; i<numLen ; ++i){

if(num[i] == '0'){
bool remainIsZero = true;
for(int j=i+1 ; j < numLen ; ++j){
if(num[j] != '0') remainIsZero = false;
}
if(!lastNumIsZero && !remainIsZero) cout << text[0];
lastNumIsZero = true;
}
if(num[i] != '0'){ 
lastNumIsZero = false;

int tindex = num[i] -'0';
int dindex = numLen-i-1;
cout << text[tindex]
   << digit[dindex];
}
}
return true;
}

void SplitMath(char* num)
{
int numLen = strlen(num);

if(numLen < 5){
BaseMath(num);
cout << endl;
}else if(numLen < 9){
char M_Math[5];
char L_Math[5];
int mindex = numLen - 4;
int i=0;
for(i ; i<mindex ; ++i ){
M_Math[i] = num[i];
}M_Math[i] = '\0';

strcpy(L_Math,&num[mindex]);

if(BaseMath(M_Math))
cout << digit[4];
BaseMath(L_Math);
cout << endl;
}else if(numLen < 13){
char B_Math[5];
char M_Math[5];
char L_Math[5];
int bindex = numLen - 8;
int mindex = numLen - 4;
int i=0;
for(i ; i<bindex ; ++i ){
B_Math[i] = num[i];
}B_Math[i] = '\0';
int j=bindex;
int k = 0;
for(j,k ; j<mindex ; ++j, ++k ){
M_Math[k] = num[j];
}M_Math[k] = '\0';

strcpy(L_Math,&num[mindex]);

if(BaseMath(B_Math))
cout << digit[5];
if(BaseMath(M_Math))
cout << digit[4];
BaseMath(L_Math);
cout << endl;
}

}

int main()
{
char str[101];

while(cin >> str){
SplitMath(str);
}

return 0;
}