LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: bmsdr

新手写代码(改过),还希望大虾再看下

[复制链接]
发表于 2005-1-17 02:25:53 | 显示全部楼层

终于改好了!

在Linux下编译运行的
受限于long类型,最大只能输入2147483647,超过即出错!
  1. #include <stdio.h>
  2. main()
  3. {
  4.         double x,y;
  5.         char *ch[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //因为UNIX下不能显示中文,只有先中这个代理
  6.         char *ch1[]={"","十","百","千"};
  7.         char *ch2[]={"元","万","亿"};
  8.         char num[30][4]; //存放整数部分的数组
  9.         char snum[3]; //存放小数部分的数组
  10.         int  i,j,k;//for用的变量
  11.         int  l=0,m=0;
  12.         long n=0,t=0;//整数及小数部分

  13.         printf("input:");
  14.         scanf("%lf",&x);//关键!这里要加上“l”!
  15.         n=(long)x; //得到整数部分
  16.         y=x-n; //得到小数部分
  17.         t=(long)(y*100+0.5); //将多少位小数转化成只有两位小数,再转成整数。如0.123就转化为12

  18.         for(i=0;i<sizeof(num)/sizeof(num[0])&&n!=0;i++) //将整数部分存在数组中
  19.         {
  20.                 for(j=0;j<sizeof(num[0])&&n!=0;j++)
  21.                 {
  22.                         num[i][j]=(unsigned char)(n%10);
  23.                         n/=10;
  24.                 }
  25.         }
  26.         i--;j--;
  27.        
  28.         for(k=0;k<2;k++) //将小数部分存在数组中
  29.         {
  30.                 snum[k]=(char)(t%10);
  31.                 t/=10;
  32.         }

  33.         for(;i>=0;i--) //转化部分
  34.         {
  35.                 m=0;
  36.                 for(;j>=0;j--)
  37.                 {
  38.                         if(num[i][j]==0)
  39.                         {
  40.                                 l=1;//0标志
  41.                         }else{
  42.                                 if(l!=0){
  43.                                         printf("零");
  44.                                         l=0;
  45.                                 }
  46.                                 printf("%s",ch[num[i][j]]); //通过数字输出相应的 中文
  47.                                 printf("%s",ch1[j]); //这是输出 十 百 千 等
  48.                                 m=1;
  49.                         }
  50.                 }
  51.                 j=3;
  52.                 if(m!=0){
  53.                         printf("%s", ch2[i]); //这是判断输出 元 万 亿
  54.                 }
  55.         }
  56.         if(m==0)printf("元");

  57.         if(snum[0]+snum[1]>0){//如果有小数部分
  58.                 if(snum[1]>0) printf("%s角",ch[(int)snum[1]]);
  59.                 else printf("零");
  60.                 if(snum[0]>0) printf("%s分",ch[(int)snum[0]]);
  61.         }
  62.         printf("\n");
  63. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-17 07:59:00 | 显示全部楼层
for(i=0;i<sizeof(num)/sizeof(num[0])&&n!=0;i++)

是什么意思呀?

sizeof(num)/sizeof(num[0])&&n!=0
不是很明白

不过我自己的也写好了

等下传上来大家帮我看看~~~

这次可以运行成功了~~~呵呵
大家在编辑下看看是否都可以成功~~~呵呵

今天好高兴
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-17 08:13:11 | 显示全部楼层
我没有给他们分配空间,就怎么直接的用的在RH下可以成功的运行
我判断0的方法是,看下一个数是不是0
如果是0就不输出,不是就输出
其他的都很好,就是在输出元的的地方老是多出一个零出来
如90  就输出 九十零元
但是如果是91 他就输出九十一元  不知道是是那出了错~~~`


  1. #include <stdio.h>                           
  2. main()
  3. {
  4. double x,y,p;
  5. char *ch[]={"零","1","2","3","4","5","6","7","8","9"};
  6. char *ch1[]={"十","百","千","万","十","百","千","亿"};
  7. char num[256];
  8. char snum[3];
  9. long i,n,j,m,t,k;
  10. printf("input:");
  11. scanf("%lf",&x);     //我把书翻烂了,在昨天晚上开知道要加个L
  12. p=x;
  13. n=(long)x;
  14. y=x-n;
  15. y=y*100+0.6;
  16. t=(long)y;


  17. for(i=0;n!=0;i++)
  18.   {
  19.   num[i]=(char)(n%10);  
  20.   n/=10;
  21.   }
  22. m=i;
  23. k=i;
  24. num[i]='.';

  25. for(i=0;t!=0;i++)
  26.   {
  27.   snum[i]=(char)(t%10);
  28.   t/=10;
  29.   }

  30. for(n=0;;n++)
  31.   {
  32.     if(num[n]=='.')
  33.       {
  34.       for(j=n-1;j>=0;j--)
  35.           {
  36.           
  37.           if(m<=5)
  38.             if((int)num[j]==0 && (int)num[j-1]==0);       //m==5 ||
  39.             else
  40.                 {
  41.                 printf("%s",ch[(int)num[j]]);
  42.                 if((int)num[j]==0);
  43.                 else
  44.                  {
  45.                  if(m>=2)
  46.                   printf("%s",ch1[m-2]);
  47.                   
  48.                   }

  49.                 }
  50.           else
  51.             if((int)num[j]==0&&(int)num[j-1]==0);          //m%4==0||
  52.             else
  53.               {printf("%s",ch[(int)num[j]]);
  54.               if((int)num[j]==0);
  55.                 else
  56.                {
  57.                if(m>=2) printf("%s",ch1[m-2]);

  58.                
  59.                   }

  60.                   }
  61.                 if(j==5) {
  62.                 if((int)num[5]+(int)num[6]+(int)num[7]>0){
  63.                 if((int)num[4]==0) printf("万");

  64.                   }
  65.                   
  66.                  
  67.                                     
  68.                }
  69.                
  70.                m=m--;
  71.           }
  72.           
  73.             printf("元");
  74.       break;
  75.       }
  76.   }
  77.   
  78. if((int)snum[0]+(int)snum[1]>0)
  79.   {
  80.         if((int)snum[1]>=1)
  81.         {printf("%s",ch[(int)snum[1]]);
  82.         printf("角");}
  83.                       else printf("零");
  84.            if((int)snum[0]>=1)
  85.         {printf("%s",ch[(int)snum[0]]);
  86.         printf("分");}
  87.   }
  88.   }

复制代码
回复 支持 反对

使用道具 举报

发表于 2005-1-17 16:41:04 | 显示全部楼层
什么是程序员?
数学才是程序员关键所在!
你们所说的“程序员“不过是 代码员 而已!
回复 支持 反对

使用道具 举报

发表于 2005-1-17 21:24:39 | 显示全部楼层
sizeof(num)/sizeof(num[0])&&n!=0
不是很明白

sizeof(num)/sizeof(num[0])就是为了改num数组定义时不用改程序,这里就是相当于30,当然其实用不了这么大,随意就改大了,num数组定义成num[4][4]就足够了,long型没这么长
n!=0就是为零是就不要再算了
回复 支持 反对

使用道具 举报

发表于 2005-1-17 21:29:55 | 显示全部楼层
Post by bmsdr

我判断0的方法是,看下一个数是不是0
如果是0就不输出,不是就输出
其他的都很好,就是在输出元的的地方老是多出一个零出来
如90  就输出 九十零元
但是如果是91 他就输出九十一元  不知道是是那出了错~~~`

参考我修改的关于零的处理,我测试过是没问题的。你判断下一位是不是零,为什么不判断再下一位呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-18 16:14:19 | 显示全部楼层
我将num[0]定义为1  在FOR的时候少让它循环一次,搞定了````
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表