在受到了谷友们代码一定的启发之后,我又尝试了一种新思路,然后分数虽然提高了但是也没有 AC。
求教各位大佬!万分感谢!悬关!(上一个帖子的谷友们也关注了)
题目链接:https://www.luogu.com.cn/problem/U363553
我的新代码(80 分):
//思路:分成若干个级,分别操作。
//为了方便,数组统一开20大小。
#include <bits/stdc++.h>
using namespace std;;
long long //保险一点,不开long long见祖宗
n,
yi,
wan,
ge,
pows [20] //方便取级的一些数,下标表示10的几次方
;;
string
convert [20] //下标取用:直接是当前位数字
= {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"},
ji [20] //下标取用:当前位编号除以4向下取整,个级不加字
= {"", "wan", "yi"},
wei [20] //下标取用:当前级内位编号,从1开始,个级不加字
= {"", "", "shi", "bai", "qian"}
;;
void read (signed x);; //读非最高级
void readx (signed x);; //读最高级
//差别就是当前级的前导零读不读
signed main (void)
{
ios::sync_with_stdio (false);;
cin.tie (0), cout.tie (0);;
for (signed i = 1; i <= 8; i++)
{
pows [i] = pow (10, i);; //初始化
}
cin >> n;;
yi = n / pows [8];; //表示把后8位砍掉
wan = n / pows [4] % pows [4];; //把后四位砍掉,取当前后四位
ge = n % pows [4];; //取后四位
if (yi) //最高级是亿级
{
readx (yi), cout << "yi";;
read (wan), cout << "wan";;
read (ge);;
}
else if (wan) //最高级是万级
{
readx (wan), cout << "wan";;
read (ge);;
}
else //只有个级
{
readx (ge);;
}
return 0;;
}
void read (signed x)
{
if (!x) //是零就直接退出
{
return ;;
}
signed tmp [20] = {0}, i = 0;; //每一位拆出来
while (x)
{
tmp [++i] = x % 10, x /= 10;; //经典操作,i在结束后表示最大位
}
if (i < 4) //如果有前导零(也就是i没有达到4)
{
cout << convert [0];; //读出来
while (!tmp [--i]);; //i移动到最后一个非0位置
}
signed l = 0; //表示第一个非0位,去掉结尾处的0
while (!tmp [++l]);;
//现在,只需要读i到l的位置就可以,注意中间的0
signed k = i;;
while (k >= l)
{
if (!tmp [k])
{
cout << convert [0];;
while (!tmp [--k]);; //k切到非0位
}
else
{
cout << convert [tmp [k]] << wei [k];;
k--;;
}
}
return ;;
}
//readx就直接复制粘贴,去掉前导零就可以。
void readx (signed x)
{
if (!x)
{
return ;;
}
signed tmp [20] = {0}, i = 0;;
while (x)
{
tmp [++i] = x % 10, x /= 10;;
}
i++;; //特殊地,先要加上1再进入循环,思考一下
while (!tmp [--i]);;
signed l = 0;;
while (!tmp [++l]);;
signed k = i;;
while (k >= l)
{
if (!tmp [k])
{
cout << convert [0];;
while (!tmp [--k]);; //k切到非0位
}
else
{
cout << convert [tmp [k]] << wei [k];;
k--;;
}
}
return ;;
}