不重复的三位数
问题描述:0-9这10个数能组成多少不重复的三位数
代码运行结果:
代码如下:
public class Ch3_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count=0;//计数器
for(int i=100;i<=999;i++) {
int a=i/100;//百位上的数
int b=i/10%10;//十位上的数
int c=i%10;//个位上的数
if(a!=b&&a!=c&&b!=c) {
count++;
}
}
System.out.println("一共有"+count+"个不重复的三位整数");
}
}
水仙花数
问题描述:水仙花数是指一个n位数(n>=3),它的每个位上的数字的n次幂之和等于他本身 。求100到999之间的水仙花数。
代码运行结果:
代码如下:
public class Ch3_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a,b,c;
for(int i=100;i<=999;i++) {
a=i/100;
b=i/10%10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i) {
System.out.print(i+"是水仙花数\n");
}
}
}
}
完全数
问题描述:完全数,又称完美数,是一些特殊的自然数。他所有的真因子(即除了它本身以外的约数)之和恰好等于他本身。例如6的约数为:1 2 3 6。除去它本身6外,其余三个数相加正好等于6。求10000以内的完全数。
程序运行结果如下:
程序代码如下:
public class Ch3_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i,j,sum;
for(i=2;i<=10000;i++) {
sum=0;
for(j=1;j<=i/2;j++) {
if(i%j==0) {
sum=sum+j;
}
}
if(sum==i)
print(i);
}
}
public static void print(int n) {
int j;
System.out.print(n+"的约数(自身除外)为: ");
for(j=1;j<=n/2;j++) {
if(n%j==0) {
System.out.print(j+" ");
}
}
System.out.print("\n");
相亲数
问题描述:A的真因数之和为B,B的真因数之和为A。求100000以内的相亲数。
程序运行结果:
程序代码如下:
public class Ch3_4 {
//求相亲数之和
private static int GetSum(int num) {
int sum=1;//赋初始值
int limit=(int) Math.sqrt(num);//num平方根
for(int i=2;i<=limit;i++) {
if(num%i==0)
sum=sum+i+num/i;//num/i 的数值与i 的乘积等于 num
}
return sum;
}
//判断两个相亲数是否相等
public static void Run(int from,int to) {
int count=0;
for(int num =from; num<=to;num++) {
int sum1= GetSum(num);
if (sum1>num) {//避免重复
int sum2=GetSum(sum1);
if(sum2==num) {
System.out.printf("%5d和%-5d是一对相亲数\n",sum1,sum2);
count++;
}
}
}
System.out.println("在"+from+"到"+to+"中共有"+count+"对相亲数");
}
//调用方法
public static void main(String[] args) {
Run(2,100000);
}
}
勾股数
求100之内的勾股数
思路:穷举法 a,b,c分别从在1-100之间进行寻找
运行结果如下:(部分结果图)
程序代码:
public class Ch3_6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GetGouGuShu(100);
}
public static void GetGouGuShu(int num) {
for(int i=1;i<num;i++) {
for(int j=i+1;j<num;j++) {//减少范围
for(int k=j+1;k<num;k++) {
if((i*i+j*j)==k*k) {
System.out.println (" "+i+" "+j+" "+k);
}
}
}
}
}
}
自守数
如果某个数的平方的末尾几位数等于这个数,即为自守数。
如 2525=625,55=25;称5即为自守数。求10000以内的自守数。
运行结果如下:
程序代码如下:
public class Ch3_7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<=10000;i++) {
zishoushu(i);
}
}
public static void zishoushu(int n) {
//把数字转换成字符串
String str1=String.valueOf(n);
//计算n的平方,并转换成字符串
String str2=String.valueOf(n*n);
//取n的平方字符串尾部与n等长的字符串,substring()截取字符串
String str=str2.substring(str2.length()-str1.length());
//如果字符串相等,则打印出来
if(str.equals(str1)) {
System.out.println(n+"是自守数");
}
}
}
3位反序数
顺序相反的数,成对出现即为反序数。如 102和201.
一个3位数各个数位上的数字均不同,他和他反序数的乘积为280021,这个三位应该是多少?
运行结果如下:
程序代码如下:
public class Ch3_8 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("要找的数如下:");
for(int i=100;i<=999;i++) {
FanXu(i);
}
}
public static void FanXu(int n) {
int i=n/100;//百位数
int j=n%100/10;//十位数
int k=n%10;//个位数
int fx=k*100+j*10+i;
if(n*fx==280021) {
System.out.println(n);
}
}
}