Code,  Tech

数字反转多种解法(C/C++)

总时间限制:   1000ms                     内存限制:   65536kB

描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。

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

输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1:
123

样例 #2:
-380
样例输出
样例 #1:
321

样例 #2:
-83
来源
NOIP2011复赛 普及组 第一题

这道题可以用很多种方法实现,不同方法代码长度差别很大。有的只需要两三行,但用数组的话也得几十行。

先说说我的解法,思路很直,拆解出这个数每一位上的系数,再倒乘权数加回去。由于权数是倒着的,所以先得知道数据有多少位,用一个for循环求出位数t,t初始值-1是因为循环结束时其实会比真实位数多1,原因显而易见。

    //求出位数t
    int t = -1;
    for(int m = n; m; m = m/10,t++){}

接着倒乘回去,这里用了Math里的乘方函数pow()。

    //r为逆转数字
    int r = 0;
    do
    {
        float p = pow(10.0, t*1.0);//每个系数的权数
        r += (n % 10) * p;
        n = n/10;
        t--;
    }while(n);
    printf("%d", r);

这种解法结果是正确滴然而求解中有所重复,比较死板笨拙,看看下面这个解法:

	int n,m=0;
	cin>>n;
	while(n!=0)
	{
		m=m*10+n%10;
		n/=10;
	}
	cout<<m;

干嘛要一次性把权数乘完呢?逐次递推乘回去,一次一次乘10的权,两行就搞定了。多么灵活干净完美!

发表评论

电子邮件地址不会被公开。 必填项已用*标注