L1-007 念数字c语言,论程序设计Test,PTA天梯赛的“L1-007 念数字”?

7ae9f0c67ff9c0904e01a6ce9fc20550.png

首先Up主发现,大学老师出的题很会唬人,讲真,不骗人~~~~~~

那么接下来,跟着Up主来分析一下这道题:

1、首先,这道题无非就是一道分解整数的题。不要被所谓的输出样式迷惑,要探求其本质!

2、此题没有任何数字大小的限制,只要求是整数,所以写出的程序必须能对整个整数数域可行!

3、对于输出的拼音,最好的方法Up主个人认为不是用字符串,而是函数+switch-case。

4、题的说明里,讲明了会有负数,所以在分解整数之前是不是应该用个小技巧将其先变成正整数呢?或者有更好的直接分解负数的方法也好,只是会不会更加麻烦呢?变为整数后,岂不是和整数分解方法一样吗?

5、到了划重点的时候了!

首先,对于分解一个整数,简单的方法就是不断地%并/10,直到这个数越来越小,最后留下1位为止。但是,本题给的情况并不能适用这个方法。要求内隐含着正向分解的要求。

如果输入的是123,输出的拼音总不能是san er yi吧。

下面说说Up主的方法,答案也是%并/10。只是,二位数才这么用。更高位的数%和/的是10的次方数。假如12345,从1开始的话就要/10000,才能得到1,然后再%10000得到2345。以此类推。

所以,先数出i位数,再用pow计算出10的i次方,最后就能开始开开心心的分解了!

附源码:

#include #include int pinyin(int x); //遵循C语言的模式,采用自定函数将部分运算转移出主函数

int main()

{

int zs = 0; //整数

int i = 0;

int cs = 1; //除数

double j;

scanf("%d", &zs);

if (zs < 0)

{

printf("fu ");

zs = zs * -1;

}

int lzs; //留存这个整数

lzs = zs;

//计算位数,从低位向高位拆数

for (i = 0; cs != 0; i++)

{

int a = 0;

a = zs % 10;

zs = zs / 10;

cs = zs;

}

zs = lzs; //恢复这个整数

for (; i != 0;)

{

j = pow (10,(i - 1)); //关键所在,从高位向低位拆数

int k = (int)j;

int mwsz = 0; //每位数字

mwsz = zs / k;

pinyin( mwsz ); //调用自定义函数,读出汉语拼音,将mwsz的值传出主函数

i--;

if (i != 0)

{

printf(" "); //空格的输出

}

zs = zs % k;

}

return 0;

}

int pinyin(int x) //自定义函数,通过main函数中的调用来实现功能,x是整形,接收同为整形的mwsz

{

switch ( x )

{

case 0:

printf("ling");

break;

case 1:

printf("yi");

break;

case 2:

printf("er");

break;

case 3:

printf("san");

break;

case 4:

printf("si");

break;

case 5:

printf("wu");

break;

case 6:

printf("liu");

break;

case 7:

printf("qi");

break;

case 8:

printf("ba");

break;

case 9:

printf("jiu");

break;

}

}

最后感谢各位观众老爷的支持,欢迎点赞!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值