亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 5576 | 回復(fù): 11
打印 上一主題 下一主題

[C] 將數(shù)字轉(zhuǎn)換成漢語(yǔ)大寫(xiě) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-11-30 20:31 |只看該作者 |倒序?yàn)g覽
本帖最后由 時(shí)間看來(lái) 于 2012-12-01 23:18 編輯

看到有討論用shell script寫(xiě)這個(gè),學(xué)習(xí)了哈。sed,gawk復(fù)制的用法還沒(méi)有搞懂~
嘗試了下用c寫(xiě),請(qǐng)多多指教!歡迎您貼出您的代碼,供我們菜鳥(niǎo)學(xué)習(xí)。
  1. /*
  2. *輸入12,如何轉(zhuǎn)換成壹拾貳,輸入1020,轉(zhuǎn)成壹千零貳拾
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. void get4num(char *dest, char *src);
  8. void output4num(char *src);
  9. int output_unit(int left_bits);

  10. char *my_array[10] = {"零","壹","貳","叁","肆",\
  11.                           "伍","陸","柒","捌","玖"};
  12. char *my_unit[5] = {"拾","佰","仟","萬(wàn)","億"};
  13. int FLAG_FIRST;
  14. int
  15. main(int argc, char *argv[])
  16. {
  17.         /*test my_array*/
  18.         int i;
  19.         for(i=0; i<10; i++){
  20.                 printf("%s\n", *(my_array+i));
  21.         }

  22.         char input_num[100];
  23.         printf("input_num:\n");
  24.         scanf("%s", input_num);
  25.         printf("%s\n", input_num);
  26.        
  27.         int input_len = strlen(input_num);
  28.         char nums_4[6];

  29.         /*output first nums*/
  30.         FLAG_FIRST = 1;
  31.         int first_num = input_len % 4;
  32.         if(first_num != 0){
  33.                 strncpy(nums_4, input_num, first_num);
  34.                 output4num(nums_4);
  35.                 output_unit(input_len);
  36.         }

  37.         /*output the left 4 nums*/
  38.         FLAG_FIRST = 1;
  39.         for(i=first_num; i<input_len; i+=4){
  40.                 get4num(nums_4, input_num+i);
  41.                 output4num(nums_4);
  42.                 output_unit(input_len-i);
  43.                 FLAG_FIRST = 0;
  44.         }

  45.         printf("\0");
  46.         return 0;
  47. }

  48. /*
  49. *get 4 numbers
  50. */
  51. void
  52. get4num(char *dest, char *src)
  53. {
  54.         int i = 4;
  55.         strncpy(dest, src, i);
  56. }

  57. /*
  58. * output 4 numbers
  59. */
  60. void
  61. output4num(char *src)
  62. {
  63.         int i, j;
  64.         int num, nums[4];
  65.         num = atoi(src);
  66.         j = strlen(src);

  67.         /*low number is at low place*/
  68.         for(i=0; i<4; i++){
  69.                 nums[i] = (num % 10);
  70.                 num /= 10;
  71.         }

  72.         /*output first nums*/
  73.         if(nums[j-1] == 0){
  74.                 if((j == 4) && (FLAG_FIRST == 0)){
  75.                         printf("%s", *(my_array+nums[j-1]));
  76.                 }
  77.         }else{
  78.                 printf("%s", *(my_array+nums[j-1]));
  79.                 printf("%s", *(my_unit+j-2));
  80.         }

  81.         /*output number and unit*/
  82.         for(i=j-2; i>=1; i--){
  83.                 if(nums[i] == 0){
  84.                         if(nums[i+1] != 0){
  85.                                 printf("%s", *(my_array+nums[i]));
  86.                         }
  87.                 }else{
  88.                         printf("%s", *(my_array+nums[i]));
  89.                         printf("%s", *(my_unit+i-1));
  90.                 }
  91.         }
  92.         if(nums[0] != 0){
  93.                 printf("%s", *(my_array+nums[i]));
  94.         }
  95. }

  96. /*
  97. * output the unit of 4 nums
  98. */
  99. int
  100. output_unit(int left_bits)
  101. {
  102.         int m, n;
  103.         m = (left_bits-1) / 4;
  104.         switch(m){
  105.                 case 0:
  106.                         return 0;
  107.                 case 1:
  108.                         printf("%s", my_unit[3]);
  109.                         return 0;
  110.                 default:
  111.                         for(n=m; n>=2; n--){
  112.                                 printf("%s", my_unit[4]);
  113.                         }
  114.         }

  115.         printf(",");
  116. }


復(fù)制代碼
input_num:
9283749817509843219827409812365908
9283749817509843219827409812365908
玖拾貳億億億億億億億,捌仟叁佰柒拾肆億億億億億億,玖仟捌佰壹拾柒億億億億億,伍仟零玖拾捌億億億億,肆仟叁佰貳拾壹億億億,玖仟捌佰貳拾柒億億,肆仟零玖拾捌億,壹仟貳佰叁拾陸萬(wàn)伍仟玖佰零捌

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2012.12.1
非常感謝樓下的回復(fù),陪我寫(xiě)玩具程序。

發(fā)現(xiàn)我上面的程序每4位輸出的單位上萬(wàn)億后都是錯(cuò)的。把重寫(xiě)了int output_unit(int left_bits),還有修改了穿過(guò)來(lái)的left_bits是4的整數(shù)倍。
根據(jù)人的讀數(shù)習(xí)慣(以4個(gè)位數(shù)為一個(gè)單元),第一感覺(jué)也就這么寫(xiě)了。相信還有跟好的方法。
2樓的就是根據(jù)每位數(shù)來(lái)判斷單位,不過(guò)我編譯運(yùn)行你的程序后,輸出是亂碼,這個(gè)我沒(méi)有搞明白。我可是很想抓你小辮子哦!哇咔咔~對(duì)你再次表示感謝。
  1. /*
  2. *輸入12,如何轉(zhuǎn)換成壹拾貳,輸入1020,轉(zhuǎn)成壹千零貳拾
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. void get4num(char *dest, char *src);
  8. void output4num(char *src);
  9. int output_unit(int left_bits);

  10. char *my_array[10] = {"零","壹","貳","叁","肆",\
  11.                           "伍","陸","柒","捌","玖"};
  12. char *my_unit[5] = {"拾","佰","仟","萬(wàn)","億"};
  13. int FLAG_FIRST;
  14. int
  15. main(int argc, char *argv[])
  16. {
  17.         /*test my_array*/
  18.         int i;
  19.         for(i=0; i<10; i++){
  20.                 printf("%s\n", *(my_array+i));
  21.         }

  22.         char input_num[100];
  23.         printf("input_num:\n");
  24.         scanf("%s", input_num);
  25.         printf("%s\n", input_num);
  26.        
  27.         int input_len = strlen(input_num);
  28.         char nums_4[6];

  29.         /*output first nums*/
  30.         FLAG_FIRST = 1;
  31.         int first_num = input_len % 4;
  32.         if(first_num != 0){
  33.                 strncpy(nums_4, input_num, first_num);
  34.                 output4num(nums_4);
  35.                 output_unit(input_len - first_num);
  36.         }

  37.         /*output the left 4 nums*/
  38.         FLAG_FIRST = 1;
  39.         for(i=first_num; i<input_len; i+=4){
  40.                 get4num(nums_4, input_num+i);
  41.                 output4num(nums_4);
  42.                 output_unit(input_len - i - 4);
  43.                 FLAG_FIRST = 0;
  44.         }

  45.         printf("\0\0");
  46.         return 0;
  47. }

  48. /*
  49. *get 4 numbers
  50. */
  51. void
  52. get4num(char *dest, char *src)
  53. {
  54.         int i = 4;
  55.         strncpy(dest, src, i);
  56. }

  57. /*
  58. * output 4 numbers
  59. */
  60. void
  61. output4num(char *src)
  62. {
  63.         int i, j;
  64.         int num, nums[4];
  65.         num = atoi(src);
  66.         j = strlen(src);

  67.         /*low number is at low place*/
  68.         for(i=0; i<4; i++){
  69.                 nums[i] = (num % 10);
  70.                 num /= 10;
  71.         }

  72.         /*output first nums*/
  73.         if(nums[j-1] == 0){
  74.                 if((j == 4) && (FLAG_FIRST == 0)){
  75.                         printf("%s", *(my_array+nums[j-1]));
  76.                 }
  77.         }else{
  78.                 printf("%s", *(my_array+nums[j-1]));
  79.                 printf("%s", *(my_unit+j-2));
  80.         }

  81.         /*output number and unit*/
  82.         for(i=j-2; i>=1; i--){
  83.                 if(nums[i] == 0){
  84.                         if(nums[i+1] != 0){
  85.                                 printf("%s", *(my_array+nums[i]));
  86.                         }
  87.                 }else{
  88.                         printf("%s", *(my_array+nums[i]));
  89.                         printf("%s", *(my_unit+i-1));
  90.                 }
  91.         }
  92.         if(nums[0] != 0){
  93.                 printf("%s", *(my_array+nums[i]));
  94.         }
  95. }

  96. /*
  97. * output the unit of 4 nums
  98. */
  99. int
  100. output_unit(int left_bits)
  101. {
  102.         int m, n;
  103.         /*the last one*/
  104.         if(left_bits < 4){
  105.                 return 0;
  106.         } else{
  107.                 m = left_bits % 8;
  108.                 switch(m){
  109.                         case 4:
  110.                                 printf("%s", my_unit[3]);
  111.                                 break;
  112.                         case 0:
  113.                                 n = left_bits / 8;
  114.                                 for(m=0; m<n; m++){
  115.                                         printf("%s", my_unit[4]);
  116.                                 }
  117.                 }
  118.         }

  119.         printf(",");
  120.         return 0;
  121. }


復(fù)制代碼
input_num:
123456789012345678901234567890
123456789012345678901234567890
壹拾貳萬(wàn),叁仟肆佰伍拾陸億億億,柒仟捌佰玖拾萬(wàn),壹仟貳佰叁拾肆億億,伍仟陸佰柒拾捌萬(wàn),玖仟零壹拾貳億,叁仟肆佰伍拾陸萬(wàn),柒仟捌佰玖拾

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書(shū)徽章
日期:2016-07-19 13:54:03程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
2 [報(bào)告]
發(fā)表于 2012-11-30 22:28 |只看該作者
本帖最后由 cokeboL 于 2012-12-01 10:56 編輯

只有一個(gè)功能不用把那個(gè)write_unit()拆出來(lái),寫(xiě)完懶得改了
  1. #include <stdio.h>
  2. #include <string.h>

  3. int write_unit(int len, char *dst)
  4. {
  5.         char tmp[32] = {0};
  6.         int i;
  7.         switch(len % 4)
  8.         {
  9.                 case 0:
  10.                         strncpy(tmp, "仟", 2);
  11.                         break;
  12.                 case 1:
  13.                         if(len % 8 == 1){
  14.                                 for(i = 0; i < len/8; i++)
  15.                                         strncpy(tmp + i*2, "億", 2);
  16.                         }
  17.                         else{
  18.                                 strncpy(tmp, "萬(wàn)", 2);
  19.                         }
  20.                         break;
  21.                 case 2:
  22.                         strncpy(tmp, "拾", 2);
  23.                         break;
  24.                 case 3:
  25.                         strncpy(tmp, "佰", 2);
  26.                         break;
  27.         }
  28.         strcpy(dst, tmp);
  29.         return strlen(tmp);
  30. }
  31.                                
  32. char *str_convert(const char *src, char *dst)
  33. {
  34.         char *tmp = src;
  35.         int i, write_len = 0;
  36.         char number[] = "零壹貳叁肆伍陸柒捌玖";

  37.         printf("src: %s\n", src);
  38.         if(*tmp <= '0')
  39.                 return NULL;
  40.         while(*tmp){
  41.                 if(*tmp < '0' || *tmp > '9')
  42.                         return NULL;
  43.                 tmp++;
  44.         }

  45.         tmp = dst;
  46.         for(i = 0; i < strlen(src); i++){
  47.                 strncpy(tmp + write_len, number + (src[i] - '0') * 2, 2);
  48.                 write_len += 2;
  49.                 write_len += write_unit(strlen(src + i), tmp + write_len);
  50.         }
  51.         if(('0' == src[i-1]) && (strlen(src) > 1))
  52.                 dst[write_len - 2] = 0;

  53.         printf("dst: %s\n", dst);
  54.         return dst;
  55. }

  56. int main()
  57. {
  58.         char tmp[100] = {0};
  59.         char tmp2[100] = {0};
  60.         scanf("%s", tmp);
  61.         str_convert(tmp, tmp2);
  62. }
復(fù)制代碼

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-12-01 23:20 |只看該作者
回復(fù) 2# cokeboL


非常感謝你的回復(fù),陪我寫(xiě)玩具程序。

發(fā)現(xiàn)我上面第一個(gè)程序每4位輸出的單位上萬(wàn)億后都是錯(cuò)的。把重寫(xiě)了int output_unit(int left_bits),還有修改了穿過(guò)來(lái)的left_bits是4的整數(shù)倍。
根據(jù)人的讀數(shù)習(xí)慣(以4個(gè)位數(shù)為一個(gè)單元),第一感覺(jué)也就這么寫(xiě)了。相信還有跟好的方法。
2樓的就是根據(jù)每位數(shù)來(lái)判斷單位,不過(guò)我編譯運(yùn)行你的程序后,輸出是亂碼,這個(gè)我沒(méi)有搞明白。
我可是很想抓你小辮子哦!哇咔咔~對(duì)你再次表示感謝。

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書(shū)徽章
日期:2016-07-19 13:54:03程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
4 [報(bào)告]
發(fā)表于 2012-12-01 23:30 |只看該作者
本帖最后由 cokeboL 于 2012-12-01 23:31 編輯

回復(fù) 3# 時(shí)間看來(lái)


不知道你用啥編譯的。。。我的運(yùn)行輸入:1234567890,打印出來(lái)的是:

src: 1234567890
dst: 壹拾貳億叁仟肆佰伍拾陸萬(wàn)柒仟捌佰玖拾

把單位的算法先明確了就能寫(xiě)明白了。我的如果有錯(cuò)你直接修改下就行了,我那拆出來(lái)的函數(shù)也沒(méi)必要,就一轉(zhuǎn)換函數(shù),挪到里面就行了。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-12-02 11:21 |只看該作者
這個(gè)有點(diǎn)實(shí)用價(jià)值,但也懶得寫(xiě)代碼也懶得分析,提供一下想法:
1、先把數(shù)字逐個(gè)壓入一個(gè)棧中,然后再逐個(gè)彈出來(lái),并按新規(guī)則重新解釋,得到一個(gè)字符串,然后反一下次序輸出。
2、重新解釋新規(guī)則時(shí),使用狀態(tài)機(jī)或者狀態(tài)遷移表來(lái)幫助分析,然后再翻譯成程序。
好的代碼應(yīng)該也會(huì)超過(guò)100行。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-12-02 11:28 |只看該作者
本帖最后由 時(shí)間看來(lái) 于 2012-12-02 11:38 編輯

回復(fù) 4# cokeboL


    嗯,我是gcc4.1.2編譯的。在你提示處理好單位后,我又重新寫(xiě)了一個(gè)。
    差不多是一個(gè)一個(gè)數(shù)字讀,不是先劃分4個(gè)數(shù)為一組。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char *my_array[10] = {"零","壹","貳","叁","肆",\
  5.      "伍","陸","柒","捌","玖"};
  6. char *my_unit[5] = {"拾","佰","仟","萬(wàn)","億"};

  7. void
  8. output_unit(int position)
  9. {
  10.         if(position == 1){
  11.                 return;
  12.         }

  13.         int left_bits = position -1;
  14.         int i, many_yi;
  15.         int case_unit;
  16.         if(left_bits % 8 == 0){
  17.                 many_yi = left_bits / 8;
  18.                 for(i=0; i<many_yi; i++){
  19.                         printf("%s", my_unit[4]);
  20.                 }
  21.                 printf(";");
  22.         } else{
  23.                 case_unit = left_bits % 4;
  24.                 switch(case_unit){
  25.                     case 0:
  26.                                 printf("%s,", my_unit[3]);
  27.                                 break;
  28.                     case 1:
  29.                         printf("%s", my_unit[0]);
  30.                             break;
  31.                     case 2:
  32.                         printf("%s", my_unit[1]);
  33.                         break;
  34.                     case 3:
  35.                         printf("%s", my_unit[2]);
  36.                             break;
  37.                 }
  38.         }
  39. }

  40. int
  41. str_convert(char *src)
  42. {
  43.         int i;
  44.         /*check the input string*/
  45.         int src_len = strlen(src);
  46.         if(src_len < 1){
  47.                 printf("dont't have enough digital");
  48.         }

  49.         /*keep the string is legal*/
  50.         for(i=0; i<src_len; i++){
  51.                 if(*(src+i) >= '0' && *(src+i) <= '9'){
  52.                         continue;
  53.                 } else{
  54.                         printf("the number is illegal\n");
  55.                         return 0;
  56.                 }
  57.         }

  58.         /*output Chinese*/
  59.         int first_bit = 0;
  60.         for(i=0; i<src_len && *(src+i) == '0'; i++){
  61.                 ;
  62.         }
  63.         first_bit = i;

  64.         char *cur_bit;
  65.         int cur_dig;
  66.         for(i=first_bit; i<src_len; i++){
  67.                 cur_bit = src + i;
  68.                 cur_dig = *cur_bit - '0';
  69.                 printf("%s",*(my_array + cur_dig));
  70.                 output_unit(src_len - i);
  71.         }

  72.         printf("\n");
  73.         return 0;
  74. }

  75. int main(int argc, char *argv[])
  76. {
  77.         char tmp[100];
  78.         printf("input a number\n");
  79.         scanf("%s", tmp);
  80.         printf("src:%s\n", tmp);
  81.         str_convert(tmp);

  82.         fflush(stdout);
  83.         return 0;
  84. }
復(fù)制代碼
input a number
src:00123 4567 | 8901 2345 | 6789 0123 | 4567 8901
壹佰貳拾叁萬(wàn),肆仟伍佰陸拾柒億億億;捌仟玖佰零拾壹萬(wàn),貳仟叁佰肆拾伍億億;陸仟柒佰捌拾玖萬(wàn),零仟壹佰貳拾叁億;肆仟伍佰陸拾柒萬(wàn),捌仟玖佰零拾壹

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-12-02 11:30 |只看該作者
回復(fù) 5# zighouse


    嗯,用遞歸,應(yīng)該不錯(cuò)。
    我下面給的代碼不超過(guò)100行啊。謝謝你的夸獎(jiǎng)。哇咔咔~

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-12-02 11:34 |只看該作者
回復(fù) 7# 時(shí)間看來(lái)


    遞歸等同于棧的操作。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-12-02 11:40 |只看該作者
回復(fù) 8# zighouse


    嗯,就是。
   

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2012-12-02 11:51 |只看該作者
回復(fù) 2# cokeboL


    比較奇怪,我輸入0123的時(shí)候,并沒(méi)有得到“零仟壹佰貳拾叁”,可能也與我開(kāi)發(fā)環(huán)境的相關(guān)。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP