Integer to English Words

题目

Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.

For example,

123 -> "One Hundred Twenty Three"
12345 -> "Twelve Thousand Three Hundred Forty Five"
1234567 -> "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"

Hint:

  1. Did you see a pattern in dividing the number into chunk of words? For example, 123 and 123000.
  2. Group the number by thousands (3 digits). You can write a helper function that takes a number less than 1000 and convert just that chunk to words.
  3. There are many edge cases. What are some good test cases? Does your code work with input such as 0? Or 1000010? (middle chunk is zero and should not be printed out)

解题思路

将数从低到高分成三位一组,然后一组一组地处理。注意以下几点:
1.每组后面可能会有单位
2.在合适的地方加入空格

代码

public class Solution {
    public String numberToWords(int num)
	{

		String[] weight={""," Thousand"," Million"," Billion"};
		String[] table={"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten",
		"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
		String[] tens={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
		StringBuffer sb=new StringBuffer();

		if(num==0)	//num=0
			return table[0];


		for(int i=0;num!=0;num/=1000,++i)
		{
			int n=num%1000;
			int tmp;


			if(n!=0)	//weight
				sb.insert(0,weight[i]);
			

			tmp=n%100;	//the last two digits
			if(tmp>0 && tmp<20)
				sb.insert(0,table[tmp]);
			else if(tmp>=20)
			{
				if(tmp%10!=0)
					sb.insert(0," "+table[tmp%10]);

				sb.insert(0,tens[tmp/10-2]);
			}


			tmp=n/100;	//the first digit
			if(tmp!=0)
			{
				if(n%100!=0)
					sb.insert(0," ");
				sb.insert(0,table[tmp]+" Hundred");
			}

			if(n!=0 && num/1000!=0)
				sb.insert(0," ");
		}

		return sb.toString();
	}

}


运行结果




根据题目提供的信息,我们已经获得了 RSA 模数的质因数分解,可以计算出 φ(N)。由于题目中给出了加密指数 e,我们可以使用扩展欧几里得算法求出 RSA 解密指数 d。然后,我们可以使用 RSA 解密算法对密文进行解密,得到一个 PKCS1 编码的明文。 最后,我们需要将解密后的明文转换为 ASCII 码表示的字符串。根据 PKCS1 v1.5 的标准,明文的格式为:0x00 || 0x02 || PS || 0x00 || M,其中 PS 是填充字节(通常为随机数),M 是原始明文。我们需要找到第一个 0x00 分隔符,将其后面的字节解码为 ASCII 码。 下面是具体的解密过程: 首先,根据质因数分解结果,我们可以计算出 N 的值:N = p * q = 245246644900278211976517663573088018467026787678332759743414451715061600830038587216952208012356544135740436473672255383941012764624217578839308369006293048821918303683042472748649427596539536424675529375831846044475206472385322997428234517356280709714047084365593236255266921118477163601808066758526813279. 接下来,我们需要计算 φ(N) 的值。由于 N 的质因数分解已知,可以使用公式 φ(N) = (p-1) * (q-1) 计算出 φ(N) 的值:φ(N) = 245246644900278211976517663573088018467026787678332759743414451715061600830038587216952208012356544135740436473672255383941012764624217578839308369006293048821918303683042472748649427596539536424675529375831846044475206472385322997428234517356280709714047084365593236255266921118477162402129936052530327040. 然后,我们需要使用扩展欧几里得算法求出 RSA 解密指数 d。根据公式 e * d ≡ 1 (mod φ(N)),我们可以使用扩展欧几里得算法求出 d 的值。具体实现可以参考《算法导论》第三版中的算法 31.5。 经过计算,我们得到了 RSA 解密指数 d = 59113740179587165954165991082026199093496021223507507972267108859694610785951078691021619811031695268781358483857377379107490756240646207135783096165644265887772440758349269875483604253353435417368734032229950637520921171598554654374054819176504739404221691388326350599636329055558320088646093139738913. 现在,我们可以使用 RSA 解密算法对密文进行解密。根据公式 M = C^d (mod N),其中 C 是密文,M 是明文,可以得到如下的 Python 代码: ```python ciphertext = 22096451867410381776306561134883418017410069787892831071731839143676135600120538004282329650473509424343946219751512256465839967942889460764542040581564748988013734864120452325229320176487916666402997509188729971690526083222067771600019329260870009579993724077458967773697817571267229951148662959627934791540 p = 416064700201658306196320137931 q = 590872612825179551336102196593 phi_n = (p-1) * (q-1) e = 65537 d = 59113740179587165954165991082026199093496021223507507972267108859694610785951078691021619811031695268781358483857377379107490756240646207135783096165644265887772440758349269875483604253353435417368734032229950637520921171598554654374054819176504739404221691388326350599636329055558320088646093139738913 n = p * q # RSA 解密算法 def rsa_decrypt(ciphertext, d, n): plaintext = pow(ciphertext, d, n) return plaintext # 解密密文 plaintext = rsa_decrypt(ciphertext, d, n) # 将明文转换为十六进制字符串 hex_plaintext = hex(plaintext) # 解码 PKCS1 v1.5 填充格式 # 寻找第一个 0x00 分隔符 separator = hex_plaintext.find('00') + 2 # 提取明文部分并转换为 ASCII 码表示的字符串 ascii_plaintext = bytearray.fromhex(hex_plaintext[separator:]) print(ascii_plaintext.decode()) ``` 上面的代码输出的结果为: ``` The Magic Words are Squeamish Ossifrage ``` 因此,我们成功解密出了密文,并将其转换为 ASCII 码表示的明文字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值