任何一个自然数m的立方都可以写成m个连续奇数之和。
如:
1^3=1
2^3=3+5;
3^3=7+9+11
请编程实现;任一自然数n,求组成n^3的n个连续奇数,格式必须与例子相同。
我使用对话框来得到和输出数字。新建了个数字类来处理数字,输出需要的字符串。在异常外套了个死循环,使得每次得到结果后可以不必重新点击运行,可以直接输入数字
/**
* 任意的数字的n的3次方都可以由3个连续奇数实现
*
* @author hongjie
*
*/
public class MathNum {
private String num = "";
public static void main(String[] args) {
// TODO Auto-generated method stub
String num;
int data;
DealNumber dealNum;
// 采用异常的机制判断输入的是否是数字
while (true) {
try {
num = JOptionPane.showInputDialog(null, "请输入任意的一个数字");
data = Integer.parseInt(num);
dealNum = new DealNumber(data);
dealNum.JudeNum();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "你输入的数字非法,请重新输入");
}
}
}
}
/**
* 处理数字的类
*
* @author hongjie
*
*/
class DealNumber {
private int num;
private String ThreePower = "^3=";
private int count = 1;
private String strNum = "";
public DealNumber(int num) {
this.num = num;
}
/*
* 将输入的数字以3个连续的奇数输出 3个连续的奇数 也可以是中间的奇数的3倍,即 :3^3=7+9+11=9*3;
*/
public void GetNumber() {
while (true) {
if ((count * num) == (num * num * num)) {
break;
}
// 计数器 加1
count += 1;
}
}
/*
* 判断数字是否是大于3的整数
*/
public void JudeNum() {
if (num == 1) {
JOptionPane.showMessageDialog(null, num + ThreePower + "1");
} else if (num == 2) {
JOptionPane.showMessageDialog(null, num + ThreePower + "3+5");
}
// 当输入的数字大于等于3的时候
else {
GetNumber();
StrintNumber();
JOptionPane.showMessageDialog(null, num + ThreePower + strNum);
}
}
/*
* 得到n个连续的奇数的字符串形式
*/
public void StrintNumber() {
int firstData = 0;
// 假如n是偶数
if (num / 2 == 0) {
firstData = (count - 1) - (num / 2 - 1) * 2;
}
// 假如n是奇数
else {
firstData = count - (num - 1);
}
// 得到要输出的字符串
for (int i = 0; i < num; i++) {
strNum += firstData;
firstData += 2;
if (i != num - 1) {
strNum += "+";
}
}
}
}
这是当输入的数字是6的时候,得到的结果:
这是当输入的不是数字的时候,得到的结果:
我对数字的处理是通过异常来得到的,其实判断输入是否为数字还可以通过正则表达式来实现,这也是比较常见的方法。
当然,对于这个题还有更简单的实现方法,其实也是个数学方法。
我们知道连续的几个奇数,可以表示为中间的数字的倍数,比如 5,7,9 可以表示为7*3
那么:
假设 m为连续的奇数的中间数字。
则: n^3=m*n
n^2=m
那么中间的那个数字为:m的开方。