三重循环实现四位的吸血鬼数

题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中抽取的数字可以任意排序。以两个0结尾的数字是不允许的。例如下列的数字都是"吸血鬼"数字:

    1260=21*60

    1827=21*87

    2187=27*81

写一个程序,找出四位数的所有吸血鬼数。

思路:将四位数按位拆分为四个数字,由这四个数字组合成两个两位数,判断这两个数的乘积是否等于原四位数。

组合:1.两个数字之间是无序的,即21*60和60*21是等价的

   2.十位和个位的数字是有序的,即12和21是不同的

循环:1.外循环:固定一个数字作为十位数,其余三个数字循环作为个位数

   2.内循环:以剩下的三个数循环,排除已被选中的数,再计算出两个数的乘积;将第一个数的个位和十位转换位置再计算判断

伪代码:

四位数的吸血鬼数字:
for(i从1000循环到9999取四位数){
  取这个四位数的个、十、百、千位上的数字存放到数组a;
  if(个位和十位的数字都为0){
    停止执行当前迭代,退回到循环起始处,开始下一次循环;
  }
  for(j从1到3循环){
    for(k从1到3循环){
      if(k不等于j){
        从数组中取出相应的两位数字,计算乘积;
        if(乘积等于四位数i){
          打印吸血鬼数;
        }
        将这个两位数的个位和十位转换位置,计算乘积;
        if(乘积等于四位数i){
          打印吸血鬼数;
        }
      }
    }
  }
}

java代码:

package operator;

public class VimpireFigures {

  public static void main(String[] args) {
    System.out.println("四位数的吸血鬼数:");
    int p1,p2,p;
    int a[]=new int[4];
    inner:    //跳转标签
    for(int i=1000;i<10000;i++){
      a[0]=i%10;
      a[1]=i/10%10;
      a[2]=i/100%10;
      a[3]=i/1000%10;
      if(a[1]==0&&a[0]==0){
        continue;
      }
      for(int j=1;j<4;j++){
        for(int k=1;k<4;k++){
          if(k!=j){
            p1=a[0]*10+a[j];  //以a[0]为固定数字
            p2=a[k]*10+a[6-k-j-0];
            p=p1*p2;
            if(p==i){
              System.out.print(a[3]+" "+a[2]+" "+a[1]+" "+a[0]+" ");
              System.out.print(p1+"*"+p2+"=");
              System.out.println(i);
            }
            p1=a[j]*10+a[0];  //个位和十位交换位置
            p=p1*p2;
            if(p==i){
              System.out.print(a[3]+" "+a[2]+" "+a[1]+" "+a[0]+" ");
              System.out.print(p1+"*"+p2+"=");
              System.out.println(i);
              if(a[k]==a[j]){
                break inner;   //当k和j相等时,会出现重复,所以一次计算后就跳转到标签位置
              }
            }
          }
        }
      }
    }
  }

}

运行结果:

时间: 2024-11-09 04:35:59

三重循环实现四位的吸血鬼数的相关文章

吸血鬼数解题思路

<Java编程思想>中有这样一道题: 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到.而这两位数字必须包含乘积的所有数字(顺序可以任意排序),能够被100整除的数是不允许的: 例如以下都是吸血鬼: 1260=21*60 1827=21*81 2187=27*81 那我们来分析一下题: 给了我们以下几个有用的条件: 由两位数相乘而得到并且包含乘积的所有数,说明乘积必须为4位(那范围必须在1000到9999之间) 不能被100整除 既然是两位数字相乘而得到那么范围就控制在:10~99,必

例题:打印乘法口诀。可能大家一看有点难,但只要理解for 循环嵌套,两层循环,外层循环行数,里层循环列数,搞清楚行数和列数之间的关系,就可以轻松做出这道题

namespace 打印乘法口诀{    class Program    {        static void Main(string[] args)        {            for (int i = 1; i <=9; i++)//行数循环九次,            {                for (int j = 1; j<=i; j++)//当i等于1的时候,j等于1,                {                    Consol

for循环每次展示固定条数的数据的写法。

第一种是一组json数据实现分页的效果,也就是每一次展示5条数据.第二种场景是每一秒展示4条数据,直到全部显示完.两种思路都做个笔记记录下. var nums = 5; //每页出现的数量 var pages = Math.ceil(data.length/nums); //得到总页数 var thisDate = function(curr){ //此处只是演示,实际场景通常是返回已经当前页已经分组好的数据 var str = '', last = curr*nums - 1; last =

hdu 5104 Primes Problem(prime 将三重循环化两重)

//宁用大量的二维不用量小的三维 #include <iostream> #include<cstdio> #include<cstring> using namespace std; int prime[1000],num[10005]; int Cout; void initPrime() { for(int i=2;i<=10000;i++) num[i]=1; for(int i=2;i<=10000;i++) { if(num[i]) { for(

矩阵k次幂 采用三重循环

#include<iostream> using namespace std; int main() { int n,k; long long a[11][11],b[11][11],c[11][11]; while(cin>>n>>k) { int x=k; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; c[i][j]=0; } k=k-1;

比赛分组 功能描述:两个乒乓球队进行比赛,各出三人。 甲队为A、B、C三人,乙队为X、Y、Z 三人,已经抽签决定了比赛名单。 已知A 不和X 比,C 不和X、Z 比,请问比赛名单是什么。(用到了三重循环)

当时看到题目的时候自己就晕了,不懂什么意思,做出来的结果竟然是一个人比好几个人,当时还觉得一个人可以打几场呢!==!后来求助大神得到了答案,共勉一下吧~~ public static void main(String[] args) { for(int a = 1 ;a<=3;a++){ for(int b = 1 ;b<=3;b++){ for(int c = 1 ;c<=3;c++){ if(a != 1 && c != 1 && c != 3 &am

floyd三重循环最外层为什么一定是K

Floyd算法为什么把k放在最外层? - 知乎 https://www.zhihu.com/question/30955032高票答案: 简单地总结一下:K没放在最外面一定是错的,但是在某些数据比较水的情况下可能会ACfloyd的本质是DP,K表示的是的DP的阶段,经过这个点松弛或者不经过这个点,如果你把K放在最里面,有可能某些点没有松弛到,所求的边就不会是最优解 如下例子说明: from to cost 1   2    4   2   3    5   3   4    3   4   5 

用for循环和递归调用写出1~N的斐波那契数列的和 和第N位的数

首先注意: 代码是从上往下,从左往右执行的!! 这是for循环写的 m=任意数.代表1~多少位的和 public class Fei_Bo_Na_Qi{    public static void main(String[] args){        int m = 30;  //这里代表1~30位的和        System.out.println( "斐波那契数列的第 "+m+" 位数为: "+m1(m) );//  在输出的时候调用函数    }   

C++第4次实验(基础班)—循环结构程序设计

此次上机中的4个题目项目6.项目7(选1)必做.其他2两题可从剩下的项目中选,也可从项目7中选. [项目1:利用循环求和]求1000以内全部偶数的和(答案:250500) 要求:请编出3个程序来,分别用三种循环语句完毕,注意体会各种循环语句的运行过程及语法特点. [项目2-分数的累加]编程序,输出1/3-3/5+5/7-7/9-+19/21的结果(答案:-0.383842) 提示:假设直接解决上面的问题有困难,能够设计一条"由易到难"的路线,逐渐解决当中要解决的问题.让自己的思路明朗起