问题标题: 酷町堂:1443 数字反转

1
0
已解决
郑怡翔
郑怡翔
初级天翼
初级天翼
#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n==0)
	{
		cout<<0;
		return 0;
	} 
	if(n<0)
		cout<<"-";
	int a,b;
	if(n>0)
	{
		while(n!=0)
		{
			a=n%10;
			n/=10;
			if(a!=0)
			cout<<a;
		}
	}
	else
	{
		int i=1;
		while(n!=0)
		{
			if(i==1)
				continue;
			else
			{
				b=n%10;
				n/=10;
				if(b!=0)
				cout<<b;
			}
			i++;
		}
	}
	return 0;
}

错误代码在上面。

样例1过了,而且输入380,输出也是83。

样例2错了,只输出负号没有输出数字。

找错!!!one four four three 

40分,2,6,8,9,10测试点超时(样例2这样的就超时了),7测试点错误。

郑怡翔在2018-08-30 11:58:01追加了内容

刚刚发现的问题:只要是<0的数,都超时,只输出负号

郑怡翔在2018-08-30 20:18:40追加了内容
#include<iostream>
#include<cmath> 
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n==0)
    {
        cout<<0;
        return 0;
    } 
    if(n<0)
    {
        cout<<"-";
        n=abs(n);   
    }
    int a;
    while(n!=0)
    {   
        a=n%10;
        n/=10;
        if(a!=0)
        cout<<a;
    }
    return 0;
}

刚改的,70分,7,9,10测试点WA,又哪个地方错了


0
已采纳
杨陈卓
杨陈卓
新手天翼
新手天翼

很简单的while循环

if(n<0)
        cout<<"-";//判断是否为负数,若是先输出一个﹣号 
    n=abs(n);//取绝对值 
    do
    {
        s=s*10+n%10;
        n/=10;
    }while(n!=0);//倒序,把每一位拆出来。 
    cout<<s<<endl;//最后输出。

 

0
0
徐铭凯
徐铭凯
资深守护
资深守护

你的第二个while循环写的混乱啊。

直接取个ABS就行了。

然后只用第一个循环。

0
屠景瑞
屠景瑞
新手光能
新手光能

你注意一下范围

-1,000,000,000≤ N≤ 1,000,000,000

是不是太小了

我建议用string。

屠景瑞在2018-08-30 22:43:47追加了内容

还有这行字:
输入格式:
输入文件名为reverse.in 。

没看见吧

0
蒋智航
蒋智航
高级天翼
高级天翼

我用for代替while循环

蒋智航在2018-08-31 09:33:01追加了内容

@屠景瑞 是这样的,酷町堂是原题照抄的,这是比赛题。肯定有.in文本文档啦。但你不用在上面写freopen

蒋智航在2018-08-31 09:48:58追加了内容

我建议用string;

变量名为str ;

首先啊啊啊啊啊啊啊,你要判断0;你这个作对啦✔✔✔✔✔✔✔✔;   tan 90°!!!

if(str==0)
	{ 
		cout<<0<<endl; 
	} 

后面我与你的代码有天壤之别,请高抬贵眼往下看:

 

else
	{ 

字符串首位为负号,就输出负号;

if(str[0]=='-')
		{ 
			cout<<"-"; 

(注:花括号没写完整只因为那一句话没写完,别作死加一个花括号就直接爆0)

for(i=str.length()-1;i>0;i--)
			{ 
				if(str[i]!='0')
				{ 
					for(;i>0;i--) 
						cout<<str[i]; 
							cout<<endl; 
					break; 
				} 
			} 
		} //这个花括弧衔接if 的花括号

↑指的是若str[0]为符号,做的逆序输出(if 你是大(蒟)佬(蒻),(不)可以用高精度做逆序输出)

若str[0]不为负号,就做普通逆序输出

else
		{ 
			for(i=str.length()-1;i>=0;i--)
			{ 
				if(str[i]!='0')
				{ 
					for(;i>=0;i--) 
					cout<<str[i]; 
					break; 
				} 
			} 
		} 
	}

                ↑ 箭头指的这个花括号是衔接最上面else的没完成的花括号(总算完成else的遗愿了)

蒋智航在2018-08-31 09:51:39追加了内容

还不会?

if(str==0)
	{ 
		cout<<0<<endl; 
	} 
	else
	{ 
		if(str[0]=='-')
		{ 
			cout<<"-"; 
			for(i=str.length()-1;i>0;i--)
			{ 
				if(str[i]!='0')
				{ 
					for(;i>0;i--) 
						cout<<str[i]; 
							cout<<endl; 
					break; 
				} 
			} 
		} 
		else
		{ 
			for(i=str.length()-1;i>=0;i--)
			{ 
				if(str[i]!='0')
				{ 
					for(;i>=0;i--) 
					cout<<str[i]; 
					break; 
				} 
			} 
		} 
	}

聪明的你可能会发现,所有的for循环都把i的定义甩在千里之外,你就在循环外定义i即可

我是用for代替while,你管得着?

蒋智航在2018-08-31 09:56:20追加了内容

最后完美🆒

return 0;

 

蒋智航在2018-08-31 10:00:02追加了内容
#include<bits/stdc++.h> 
using namespace std;
string s;
int a[102];
int main()
{
    cin>>s;
    a[0]=s.length();
    for (int i=1;i<=a[0];i++)
    {
        a[i]=s[a[0]-i]-'0';
        cout<<a[i];
    }
    return 0;
}

以上是逆序输出高精度代码

举报者最帅

蒋智航在2018-08-31 10:00:37追加了内容

不对不对,是采纳者最帅

蒋智航在2018-08-31 10:08:41追加了内容

哎呀,管理员若收到举报消息别关闭❎这个回答啊,我花了n分钟才打完的,再说,我只是发一下保险的高精度逆序输出代码,虽然是完整的,但是不是这一题啊,我知道我手*,但是

  • 私はタイピングが大変ですね。

  • 我很生气

  • 唉唉唉唉唉唉

  • 此处省略2⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹个字

  • 高精度代码是给大佬看的

  • 只有不想举报我的人才能看见我的高精度代码

 

蒋智航在2018-08-31 10:18:16追加了内容

实话实说,我是蒟蒻

 

差距是什么,我不曾知道 差距在哪里,我不曾探索 直到接触了OI,我便有了答案 差距使我的生活变得暗淡无光 差距使我的前途一片迷茫 差距使我失去未来的方向 有人用了1个月从0基础学到网络流 我用了一世纪还没学完基础 这,就是差距 有人用了30分钟就可以AK比赛 我用了一世纪却1分都拿不到 这,也是差距 有人用10分钟就可以打好一题 我却用了一世纪 这,还是差距 有人打一题的代码用了20行 我却用了10000行 这,仍然是差距 看着别人和我的差距越来越大,越来越远 我好像突然明白 只有自己开始改变 差距才会改变

 

蒋智航在2018-08-31 14:56:37追加了内容

首先我们来看一下题目,题目要求我们把数字翻转过来输出,不过要是我们正常的数字表现形式,也就是第一个非0数字前面不能有0,打个比方,如果我们输入100,那么最后的结果就是1,因为100反过来输出结果就是001,不过我们平时的数字可不是这样的哦,正常的是不是应该是1才对,当然,如果我们输入的数字是0,按照题目要求,我们直接输出0就好了,当然,还有同学考虑到了负数的问题,其实呢,负数也就是在我们正常见到的正整数的基础上加了一个“-”号而已,所以负数的处理和正整数是一样的,因为即使你把每位数字反过来输出,它的正负性质是不会改变的,所以对于负数我们也和正数一样的处理就行了,不需要特别考虑。

我们再来讲一下解题的思路,要把数字翻转过来,很明显我们需要把他的每一位数字都取出来,但是和上一题不同的是,我们并不知道这个数字是多少位的,所以并不能我们之前的方式来处理,那么该怎么办呢?

我想大家应该知道我们取出每一位数字的处理办法,就是把数字%10,取完每位数字之后我们还需要把原来的数字除以10,那么如果这样一直处理下去呢,到最后一位数的时候,他除以10的结果肯定会是0,因为最后一位数肯定是小于10的,所以我们就能够通过这个来解题,我们可以通过while循环来判断结束条件,如果除到最后它的值是0了,说明循环就结束了,我们也取出了他的每一位数字。

那么我们怎么得到最后的结果呢,我们假设初始的数字是n,那么我们的的循环条件也就是while(n!=0),这里假设我们先取出了个位数字,也就是n%10,我们设置另一个变量sum求最后的结果,取出了个位数字之后我们的sum就应该加上个位数,然后n应该除以10(n=n/10),然后再取十位上的数,那么就把刚才除以10之后的n再%10,就取出来了这个数字,然后sum就应该加上这个值了,不过有变化的就是,我们刚才取出的个位数字是不是应该升到十位上了,这样才能让我们原来的数字反过来,那么就应该把个位数字*10再加上取出来的十位数字,接下来的数位处理方法也和这个一样,这里也就是我们的sum要变成这样:sum=sum*10+n%10;使用这种方式,我们都不用考虑输入数字是0的情况,因为我们初始化sum=0,当n=0的时候,不进入循环,直接输出sum,而sum=0.

 

拓展:

拓展一种解法,其实呢,我们可以把数字看成字符串,然后反过来输出字符串的每个字符就行了,这种方法看起来很简单,但是实际上要考虑的问题还是非常多的,首先我们要考虑只有一个0的情况,要单独输出;然后正数,我们要反过来找出第一个不是字符0的字符开始输出;然后是负数的情况,我们要先输出‘-’号,然后其他的操作和正数一样,这种方式比较复杂!

 

我要回答