//修正了N次,应该可以了吧@@
//终于搞定了,8位数(千万)的转换…
//即然都讨论到这了,成果就分享给大家吧
//请用 Dev-C++ 来编译,MS-VC++ 6 大概不能用.
//而我也不懂VC++ 6….程序不知有什么潜在问题,
//目前是没找到bug,因为数目太大了,无法一个一个测.
//请用 Dev-C++ 来编译
#include <iostream>
#include <climits> //限制 int qX 范围为int最大值,避免输入的数目太大,造成程序误判. 
using namespace std;
string aX(int); //自定函数 
int main()
{ 
    int qX = INT_MAX; //储存输入值,并限范围为int最大值. 
    int x0,x1,x2,x3,x4,x5,x6,x7; 
    
    // 个位数~万位数,万位数~千万位数(值:1/0 ,1=是/0=否)
    int zeroX;
    int a1; //万位数到千万位数  判断万位数是否有数值. 1=有 ,0=无 
    
    string ch0,ch1,ch2,ch3,ch4,ch5,ch6,ch7;
    string ok1,ok2; //万以下,万以上
    
    //使用者轮入 
    cout <<"请输入数字(8位数内): ";
    cin >> qX;
    if(qX>99999999){cout <<"位数太大或格式不正确" <<endl; return 0;} 
    
    //单位转换 
    x7 = qX/10000000; //千万 
    x6 = qX%10000000/1000000; //百万 
    x5 = qX%10000000%1000000/100000; //十万 
    x4 = qX%10000000%1000000%100000/10000; //万 
    x3 = qX%10000000%1000000%100000%10000/1000; //1万的余数就是千,有几千呢?? ,再除以1000就是了. 
    x2 = qX%10000000%1000000%100000%10000%1000/100; //万的余数是千,千的余数剩百,几百再除以100就是了. 
    x1 = qX%10000000%1000000%100000%10000%1000%100/10;//同上推演下来... 
    x0 = qX%10000000%1000000%100000%10000%1000%100%10;//同上推演下来... 
    
    //千万位数转中文 
    if(x7!=0){ch7 = aX(x7);} //aX(x7)呼叫自定函数处理数据,并返回结果值. 
    
    //百万位数转中文 
    if(x6!=0){ch6 = aX(x6);} 
    //十万位数转中文 
    if(x5!=0){ch5 = aX(x5);}
    
    //万位数转中文 
    if(x4!=0){ch4 = aX(x4);}
    
    //千位数转中文  
    if(x3!=0){ch3 = aX(x3);}
    
    //百位数转中文  
    if(x2!=0){ch2 = aX(x2);}
    
    //十位数转中文  
    if(x1!=0){ch1 = aX(x1);}
    
    //个位数转中文  
    if(x0!=0){ch0 = aX(x0);}
    
    //以下为显示结果,"零"特殊处理 
    zeroX = x0+x1+x2+x3;
    
    //千万位数处理
    if(x7!=0){ok2 = ok2+ch7+"千",a1=1;}
    if(x7==0){ok2 = "",a1=0;} //位数0则空白,a1=0 (万位数目前为0) 
    
    //百万位数处理
    if(x7!=0 && x6!=0){ok2 = ok2+ch6+"百",a1=1;}
    if(x7==0 && x6!=0){ok2 = ok2+ch6+"百",a1=1;} 
    if(x7==0 && x6==0){ok2 = "",a1=0;} //千万和百万位数为0,则a1=0 (万位数目前为0) 
    if(x7!=0 && x7!=0 && x6==0 && x5+x4!=0){ok2 = ok2+"零",a1=1;} 
    
    //十万位数 
    if(x7+x6!=0 && x5!=0){ok2 = ok2+ch5+"十",a1=1;} 
    if(x7+x6==0 && x5!=0){ok2 = ok2+ch5+"十",a1=1;}
    if(x7+x6==0 && x5==0){ok2 = "",a1=0;}//千万和百万和十万位数皆为0
    if(x7+x6!=0 && x6!=0 && x5==0 && x4!=0){ok2 = ok2+"零";} 
     
    //万位数 -----------------
    if(x7+x6+x5!=0 && x4!=0){ok2 = ok2+ch4,a1=1;}//万 
    if(x7+x6+x5==0 && x4!=0){ok2 = ok2+ch4,a1=1;}
    if(x7+x6+x5==0 && x4==0){ok2 = "",a1=0;}//千万和百万和十万和万位数皆为0
    //注: al=0的部份,在ok2中都会填上空白,在最后结果就不会显示该位数 
    //ok2 是存万位以上单位的结果值, ok1是千位数以下结果存放. 
    
    if(a1==1){ok2 = ok2+"万";} //万的显示时机运算 
    
    //万和千位数交接地方的特别处理 
    if(x4==0 && x3!=0 && a1==1){ok1 = ok1 +"零";} 
    //if(x4==0 && x6!=0 && x5==0 && x3!=0){ok1="";} //特级处理 
    //if(x4==0 && x6==0 && x5==0 && x3!=0){ok1="";} //特级处理  
    //if(x4==0 && x6==0 && x5!=0 && x3!=0){ok1="";} //特级处理
    //if(x4==0 && x6!=0 && x5!=0 && x3!=0){ok1="";} //特级处理
    
    //个位到千位数处理 
    
    //千位数 
    if(x3!=0){ok1 = ok1+ch3+"千";} 
    if(a1==1 && x3==0 && x2+x1+x0!=0){ok1 = ok1 +"零";}
    
    //百位数 
    if(x2!=0){ok1 = ok1+ch2+"百";}
    if(x3!=0 && x2==0 && x0+x1!=0){ok1 = ok1 +"零";}
    
    //十位数 
    if(x1!=0){ok1 = ok1+ch1+"十";}
    if(x2!=0 && x1==0 && x0!=0){ok1 = ok1 +"零";}
    
    //个位数 
    if(x0!=0){ok1 = ok1+ch0;}
    if(x0==0 && a1==0 && zeroX==0){cout <<"零";} 
    
    cout << ok2+ok1 <<endl; //ok2为千万到万处理结果 + ok1为千位数到个位数处理结果 
    return 0;
}
//转中文专用 
string aX (int ok) //自定函数内容,在int main()中以aX(数值)来呼叫使用.
                   //数值填入要转换的单位值,如个位数是x0,则aX(x0). 
{
       string aa; //存放转换结果暂存区 
       switch(ok) //代入要转换的值 
   {
      //case 0:
      //     aa="零";
      //break;
      
      case 1: //代入数值为 1 时,则处理这个程序 
           aa="一";
      break;
      
      case 2: //代入数值为 2 时,则处理这个程序 
           aa="二";
      break;
      
      case 3: //代入数值为 3 时,则处理这个程序 
           aa="三";
      break;
      
      case 4: //代入数值为 4 时,则处理这个程序 
           aa="四";
      break;
      
      case 5: //代入数值为 5 时,则处理这个程序 
           aa="五";
      break;
      
      case 6: //同上类推.... 
           aa="六";
      break;
      
      case 7:
           aa="七";
      break;
      
      case 8:
           aa="八";
      break;
      
      case 9:
           aa="九";
      break;
      
      return aa; //把结果传回int main程序代码中的呼叫位置,如aX(x7)结果就是这里的值 
    }
}
[此贴子已经被作者于2006-9-27 5:36:22编辑过]