反转数

今天朋友介绍了一个网站叫http://projecteuler.net/,非常有意思,其中有这么一道题:

Some positive integers n have the property that the sum [ n + reverse(n) ] consists entirely of odd (decimal) digits. For instance, 36 + 63 = 99 and 409 + 904 = 1313. We will call such numbers reversible; so 36, 63, 409, and 904 are reversible. Leading zeroes are not allowed in either n or reverse(n).

There are 120 reversible numbers below one-thousand.

How many reversible numbers are there below one-billion (109)?

写了一段C程序,在我的机器上花了138秒求出了解,后来在朋友的指点下,优化成67秒。

跑去网贴上一看,有个牛人的程序更快,在我的机器上只要跑17秒,汗一个。

转数字有多种实现方法,以下为几种常见的实现方式及代码示例: ### 首尾交换法 运行效果示例:原整数值:123,转输出 => 321;原整数值:-321,转输出 => -123;原整数值:726380,转输出 => 83627;原整数值超出32位有符号整数范围(如2147483647、 -2147483648),转输出 => 0 [^3]。 ### 直接计算法 使用`int`类型可以方便去掉前导0,若数字为负数则先转换为正数,每次通过取模和除10操作进行转,直接计算出转后的数。以下是Java代码示例: ```java import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine()); int ans = 0; while (n != 0) { ans = ans * 10 + n % 10; n /= 10; } System.out.println(ans); in.close(); } } ``` 这种方法可解决“给定一个整数,将该数各个位上数字转得到一个新数”的问题,新数满足整数常见形式,除非原数为零,否则转后新数最高位数字不为零,数据范围为`|N| ≤ 10^9` [^4]。 ### 递归法 使用递归的方法除10实现数字转,以下是代码示例(原代码存在小错误,已修正): ```java public class ReverseNumber { public static void reverse(int a) { if (a / 10 == 0) { System.out.print(a % 10); } else { System.out.print(a % 10); reverse(a / 10); } } public static void main(String[] args) { int num = 123; reverse(num); } } ``` 该方法通过递归调用不断输出数字的最后一位,实现数字转 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值