[穷举]三位水仙花

先来一个问题(不要笑我太简单)

打印三位数字中的水仙花数共有多少个,分别是多少
(水仙花数是指一个 n 位数 3,它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153))

 李俊亚 2012-11-21 10:48:47 1 楼

public static void main(String []args) {
int i,j,k,l,m;
int count=0;
System.out.println("三位数字中的水仙花数分别是");
for(i=100;i<1000;i++) {
j=i%10;
k=i/10;
l=k%10;
m=k/10;
if(i==j*j*j+l*l*l+m*m*m) {
System.out.print(i+"、");
count++;
}
}
System.out.println("三位数字中的水仙花数共有"+count+"个");
}
 top
 王洪宇 2012-11-21 10:50:19 2 楼

class Text {
public static void main() {
for(int i=100;i<1000;i++) {
int gewei=i%10;
int shiwei=(i%100)/10;
int baiwei=i/100;
if(Math.pow(baiwei,3) + Math.pow(shiwei,3) + Math.pow(gewei,3) == i )
System.out.println("水仙花数:" + i);
}
}
}
 top
 孟凡帆 2012-11-21 11:03:02 3 楼

public class Example5_2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i,j,m,n;
int count=0;
for(int k=100;k<=999;k++) {
i=k/100;
j=(k%100)/10;
m=k%10;
n=i*i*i+j*j*j+m*m*m;
if(k==n) {
System.out.println(k);
count++;
}
continue;
}
System.out.println("水仙花数为:"+count);
}
}
 top

 

李辰霖 2012-11-21 11:32:41 4 楼回复1楼 李俊亚

注意java编码的时候"&"是一般不另起一行,显得专业一点。

建议根据上面的思路  编一个方法,输入一个任意长度的数,求各位上的数。输入参数与返回类型自己定义。编完发给我看看。

 top

 

 李士献 2012-11-21 12:47:40 5 楼

package tudu;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class ShuiXianHua{
@Test
public void displayThree() {
int count=0;
for(int i=100;i<=999;i++) {
int sum=0;
for(int tmp:spilt(i)) {
sum+=Math.pow(tmp,3);
}
if(sum==i) {
System.out.println(i+"是水仙花数");
count++;
}
}
System.out.println("三位数中水仙花数共有"+count+"个");
}
public List<Integer> spilt(int i){
List<Integer> numbers=new ArrayList<Integer>();
for(;i>0;){
numbers.add(i%10);
i/=10;
}
return numbers;
}
}
 top

 

 王强 2012-11-21 12:54:31 6 楼

public class shuixianhua {
public static void main(String[] ss){
int m,a,b,c;
for(m=100;m<=999;m++) {
a=m/100;
b=m/10%10;
c=m%10;if(m==a*a*a+b*b*b+c*c*c)
System.out.println(m);
}
}
}
 top

 

 王洪宇 2012-11-21 12:54:44 7 楼

class T() {
public static void main(String args[]) {
for(int i=1;i<10;i++) {
for(int j=0;j<10;j++) {
for(int k=0; k<10 ; k++) {
int x = i*100 + j*10 + k;
if(i*i*i + j*j*j + k*k*k = x) {
System.out.println(x);
}
}
}
}
}
}
 top
 李士献 2012-11-21 13:06:34 9 楼

回复7楼 王洪宇

if(i*i*i+j*j*j+k*k*k == x)

两个等号 ,大家引以为鉴

 top

 

 李辰霖 2012-11-21 13:15:53 10 楼


public class test {
public static void main(String[] args){
for(int i=100;i<1000;i++) {
if(isNarc(i)) {
System.out.println(i);
}
}
}


public static boolean isNarc(long num) {
int[]a= getBit(num);
int sum=0;
for(int c:a) {
sum+=Math.pow(c, a.length);
}
if(sum==num) {
return true;
}

  else{
return false;
}
}


public static int[] getBit(long num){
String n=""+num;
int[]a=new int[n.length()];
char[]b=n.toCharArray();
for(int c=0;c<b.length;c++){
a[c]=b[c]-48;
}
return a;
}
}

 top
 李俊亚 2012-11-21 13:21:09 11 楼

回复4楼 李辰霖

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入一个任意长度的int型整数:");
Scanner scanner=new Scanner(System.in);
int i=scanner.nextInt();
System.out.println("原数是:"+i);
System.out.print("利用除法拆分之后的倒序是:");
mathDevide(i);
System.out.println("利用字符串拆分后是:");
stringDevide(i);
}
static void mathDevide(int j)//利用除法拆分
{    int m=j,n;
do{n=m%10;
m=m/10;
if(m!=0)
System.out.print(n+"、");
else
System.out.println(n);
}while(m!=0);
System.out.println();

}
static void stringDevide(int j)
{    String s;
s=String.valueOf(j);
for(int i=0;i<s.length();i++)
{    if(i!=s.length()-1)
System.out.print(s.charAt(i)+"、");
else
System.out.println(s.charAt(i));
}
System.out.println();
}

 

 刘灿 2012-11-21 14:26:09 12 楼

package com.tudu;
public class Shuixianhua {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int m,n,p,q;
for(m=100;m<1000;m++)
{
n=m/100;
p=m%10/10;
q=m%10;
if(m==n*n*n+p*p*p+q*q*q)
System.out.println("三位数中的水仙花数为:"+m);
}
}
}
王世朋 2012-11-21 21:22:06 13 楼

public class shuixianhua {
public static void main(String args[])  {
System.out.print("水仙花数有:");
for(int i=100;i<1000;i++)   {
int a=i%10;
int b=i/10%10;
int c=i/100;
if(a*a*a+b*b*b+c*c*c==i)
System.out.print("  "+i);
}
}
}
杨峰 2012-11-21 21:57:31 14 楼

#include<iostream>
using namespace std;
int main() {
int a,b,c,d;
cout<<"水仙花数分别为:"<<endl;
for(int i=100;i<=999;i++) {
a=i/100; b=(i%100)/10; c=i%10;
d=a*a*a+b*b*b+c*c*c;
if(i==d)
cout<<i<<"t"; }
return 0;
}
top

李士献 2012-11-22 10:04:07 15 楼

纵观以上所有代码,大家可以看出:用到的基本都是穷举方式(所谓的穷举,想必大家也一定有所了解了吧,就是把所有的可能拿过来,一个一个进行尝试,这种方式解决什么问题都是可以的,只要你的计算机够快,只要你愿意等的时间够长),对于本题有两种思路,在此给大家开拓一下! 第一种:从100循环到1000,这是大家都采用的方式。 第二种:参考7楼的算法,三层循环,不用取数字,直接求幂再求和就行了。(不失为一种思路)  如果使用第一种穷举的话>需要用到两点:1、拆分数字;2、求幂求和 对于拆分数字,纵观以上所有我觉得好的解决方式有两种: 一种参考8楼图片所示。 另外一种参考10楼霖少提供的方法使用String.toCharArray()方法将字符串转成数组从而保存所有位子上的数字,这个时候数组中保存的是数字的ASCII码值,霖少又采用了一种NBB的方式 减去48就结了,希望大家向霖少学习,在此向霖少致敬,霖少NB,敬礼!!! 对于求幂运算,考虑到程序的可扩充性,建议大家使用Math.pow(a,b)函数求解,因为想象一下,如果你要求的是7次幂,20次幂等,那是不是要写20个i相乘。 对于求和运算,如果将每位上的数字保存在数组中(10楼霖少提供的方法),或者将每位上的数字保存在ArrayList中(5楼我的算法),那么在求和的时候可以for循环求,这个时候又有一个技巧,对于jdk1.5以上版本,支持增强for循环,具体怎么回事,参考5楼和10楼的写法,往后这种方式会非常常用,希望大家注意,但要注意jdk1.5以上版本支持。  另:希望大家写程序的时候要向10楼的霖少,11楼的俊亚同学学习,他们的程序看起来有一股专业的味道。要注意自己程序的模块化。 当然此非一朝一夕能成,希望大家多练习。  另:如果大家要在程序中通过控制台输入内容,可以使用Scanner类。详见11楼  另:可以使用Junit进行测试,有兴趣的童鞋找一找相关用法.参考5楼

李士献 2012-11-22 17:19:50 16 楼
最后的结果贴出来, 3位的水仙花数共有4个,分别是153 370 371 407

转载请注明:赛恩软件; [穷举]三位水仙花

发表评论

您必须 登录 才能发表留言!