蒟蒻再次征解
  • 板块灌水区
  • 楼主junhaowang
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/5 16:15
  • 上次更新2023/11/2 15:29:10
查看原帖
蒟蒻再次征解
562521
junhaowang楼主2023/10/5 16:15

捞

在受到了谷友们代码一定的启发之后,我又尝试了一种新思路,然后分数虽然提高了但是也没有 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 ;;
}
2023/10/5 16:15
加载中...