0~9十个数,每个数只能使用一次,组成两个三位数相加和为四位数的算法

  这几天上网,看到百度里面有人问这一道题目,0~9十个数,组成如下加法式 *** + *** = ****,每个数字都只能使用一次,问一共多少中组合?

今天,就用C#语言来写一下,解出这道题,其他语言算法相同,只是语法不同,这里由于时间关系,不再贴出代码。

  针对大家提出的优化建议,已经将优化方案写出,下面是具体优化方案:

  这里先讲解一下思路,首先我们是程序员,不是数学家,我们是站在编程的角度思考问题。这里是两个三位数相加,得到一个四位数,所有数字不能重复,最大的和应该为987 + 654 = 1641,就是说两个三位数相加的结果不会超过2000.那么1一定在后面的四位数中, 那么最小的三位数是203,最大的三位数是987,确定循环的范围,当然你非要用100到999也可以,不过就是效率低一些罢了。

  通过循环,得到两个三位数后,然后就是将两个数相加,得到他们的和,验证和是否为四位数、是否重复使用了数字。当然这两个可以放到一起验证,我的思路是,将两个三位数和他们的和,拼成一个字符串,然后判断0~9哪个数字不存在字符串中,只要有一个不存在,就不符合条件,只有0~9都存在,才是正确结果。

  下面用代码来实现一下,打开VS2010,新建一个控制台程序,打开Program.cs开始编写代码,全部代码如下:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestConsoleApp
{
   class Program
   {
      static void Main(string[] args)
      {
         long start = DateTime.Now.Ticks;
         //实例化PrintNum类
         PrintNum pNum = new PrintNum();
         pNum.printNumbers();
         long useTime = DateTime.Now.Ticks - start;
         Console.WriteLine("Time used:" + useTime / 10000 + "ms");
         Console.Read();
      }
   }

   public class PrintNum
   {

      public void printNumbers()
      {
         int result = 0;
         int lineNum = 1;
         for (int i = 203; i <= 987; i++)
         {
            for (int j = 203; j <= 987; j++)
            {
               result = i + j;
               if (isTrue(result, i, j))
               {
                  Console.Write(lineNum.ToString("00") + ": ");
                  Console.Write(i + " + ");
                  Console.Write(j + " = ");
                  Console.Write(result + "\t");
                  //每行显示三个
                  if (lineNum % 3 == 0)
                  {
                     Console.WriteLine();
                  }
                  lineNum++;
               }
            }
         }
      }

        public bool isTrue(int result,int i,int j)
        {
            String str = "0123456789";
            String s = result + "" + i + "" + j;  

            for(int k = 0;k < str.Length;k++)
            {
               if (!s.Contains(str[k]))
               {
                  return false;
               }
            }

            return true;
         }
   }
}

 

这里写了一个PrintNum类,将方法封装到类里面,然后在main方法中实例化该类,调用方法输出结果。结果如下:

 

这是常规写法,代码没有经过优化,看到执行这个过程一共消耗了474ms.下面是经过优化的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestConsoleApp
{
   class Program
   {
      static void Main(string[] args)
      {
         long start = DateTime.Now.Ticks;
         //实例化PrintNum类
         PrintNum pNum = new PrintNum();
         pNum.printNumbers();
         long useTime = DateTime.Now.Ticks - start;
         Console.WriteLine("Time used:" + useTime / 10000 + "ms");
         Console.Read();
      }
   }

   public class PrintNum
   {
      public void printNumbers()
      {
         int result = 0;
         int lineNum = 1;
         for (int i = 203; i <= 987; i++)
         {
            for (int j = 987; j >= 203; j--)
            {
               result = i + j;        
               if (result > 1000)
               {
                  if (isTrue(result, i, j))
                  {
                     Console.Write(lineNum.ToString("00") + ": ");
                     Console.Write(i + " + ");
                     Console.Write(j + " = ");
                     Console.Write(result + "\t");
                     //每行显示三个
                     if (lineNum % 3 == 0)
                     {
                        Console.WriteLine();
                     }
                     lineNum++;
                  }
               }
               else
               {
                  break;
               }
            }
         }
      }

        public bool isTrue(int result,int i,int j)
        {
            String str = "0123456789";
            String s = result + "" + i + "" + j;  

            for(int k = 0;k < str.Length;k++)
            {
               if (!s.Contains(str[k]))
               {
                  return false;
               }
            }

            return true;
         }
   }
}

 

执行结果如图:

执行共耗时315ms,一下减少了100多毫秒,当然我的电脑性能好,在性能差一点的电脑上面,差别就不是这么多了。优化的思路是,内循环从大到小,当两个数相加小于1000及不是四位数时,退出本次循环。就是减少了循环次数。

是的,你没看错,前面的是序号,一共96个结果。说实话,我也没想到会有这么多。。。

 

 

时间: 2024-09-02 21:23:33

0~9十个数,每个数只能使用一次,组成两个三位数相加和为四位数的算法的相关文章

构造一个四位数,前两位和后两位分别相等,但不完全相等,且该数是一个数的平方

//构造一个四位数,前两位和后两位分别相等,但不完全相等,且该数是一个数的平方#include<stdio.h>#include<math.h>int main(){ int i,j,k; int m; for(i=1;i<=9;i++) for(j=0;j<=9;j++) if(i!=j) { m=1000*i+100*i+10*j+j; for(k=31;k*k<m;k++);//用空语句,判断该数是否存在,若存在则k*k==m:或者min=sqrt(1100

ADO.NET2.0的十大最新特性

ado                                                                          ADO.NET2.0的十大最新特性         这篇文章概述了.NET Framework 2.0里的ADO.NET2.0的最新特性.在以下叙述中将附带一些简单的例子来讨论这些特性的细节. 以下便是ADO.NET新增的特性: 1. 批量复制操作(Bulk Copy Operation) 将数据从一个数据源批量复制到另一个数据源是ADO.NE

iis7.0-IIS 7.0自定义错误页面状态码只能填401之类的无法再细化如401.1会报格式错误

问题描述 IIS 7.0自定义错误页面状态码只能填401之类的无法再细化如401.1会报格式错误 这是IIS 环境配置问题还是说 .net版本问题 有人遇到过么??? 网上其他IIS 基本上错误页面自定义也是很全面的

整数只能输入4位小数点后面取三位 他们的总长度不超过7位

问题描述 整数只能输入4位小数点后面取三位 他们的总长度不超过7位 整数只能输入4位小数点后面取三位 他们的总长度不超过7位 1234.123 这样是可以的 0.235这样也可以 1234.1 这样可以 (正则表达式) 解决方案 昨天也是你的前面9位数字,后面2位数字正则么?一样的问题-- ^d{1,4}(.d{1,3})$

富士通价值数十亿美元的ARM超级计算机或将推迟达两年

富士通公司发布的ARM超级计算机Post-K,很可能无法在2020年顺利交工. 富士通价值数十亿美元的ARM超级计算机或将推迟达两年 消息称,这一价值高达9.1亿美元的项目之所以陷入僵局,是因为工程师们需要更多时间设计.测试并改进其处理器方案. 富士通公司当初受日本RIKEN委托制造一台百亿亿次级别的超级计算机,旨在替代目前目前在全球超级计算机榜单上排名第五的K超算. 当Post-K出现时--如果其真的能够实现接近百亿亿次的高性能承诺,那么其运算速度可达当前超算榜首神威-太湖之光的八倍.Post

工业4.0的十大关键词

这是一场变革,在历史上,从来都是企业跟随着旗帜行动,旗帜先指向某处,企业便紧随其后,每个世纪都是这样.但是今天我们的力量发生了变化,现在是企业走在前面,然后这面旗帜才跟上.这就好像在以前国家打破各种制约,打开外交关系以支持国家的进出口,而今天,这样做的需求已经不那么大了. 我们生活在一个开放的世界,并且政策往往还会跟着企业的步伐而改变.我最近得以荣幸地推荐给德国总理的一本叫做<第二机器时代>的书,该书的作者是迈卡菲,是我在MIT的一位同事.而书里面讨论的最多的也正是当前的热点,就是过去一个世纪

也谈论坛“BBS2.0”的十大升级方向

近日,国内CHINABBS.DONEWS. 纵横论坛以及中国TNT论坛等各大论坛频频发力,开始了新一轮论坛竞争大战,这一方面预示着论坛的价值正在被2.0朝中的创业者们重新认识,一方面也预示了在新一轮论坛大战中,升级性的创新呼之欲出.那么,目前的论坛BBS出从哪些方面进行创新?     论坛的凝聚内容和关系的真正的大集市,但是传统的论坛在关系凝聚和内容凝聚方面存在一定的缺陷,在内容提升和交流把关方面存在一定的缺陷,在跨版互动和全方向交流方面存在一定的缺陷,在个人化与内容之间的平衡感方面也存在一定的

微软Windows NT 4.0二十周年了

二十年前,也就是1996年7月31日,微软推出Windows NT 4.0. NT 4.0并不是微软推出的第一个NT操作系统版本,但是NT 4.0是最后一个支持Alpha.MIPS和PowerPC架构的主要版本,它也是NT产品线中最后一个名字里带有"NT"品牌的版本.事实上,之所以称为"NT",通常的说法是NT指的是"新技术(New Technology)".微软杰出工程师Dave Cutler编写了NT的内核. NT有好几个变种,其中包括Win

警惕!勒索病毒DXXD 2.0版来袭,黑客称只能缴纳赎金无法破解

   一波未平,一波又起. 昨天,有一起突发事件:据受害者向雷锋网(公众号:雷锋网)爆料,本来一路心情愉快地去上班,开机却遭遇突发异常状况:"昨天下班前电脑还好好的,今天突然开机之后电脑突然很卡,我并没有在意.结果等了一会,突然浏览器自动打开,弹出了一个勒索界面,告诉我所有的文件都已经被加密了,只有点击链接用比特币交付赎金之后才能拿到解密的密钥."详情请见 安全专家深度解析,一觉醒来文件加密被逼万元赎金,怎么破? 上述中招文件均被加密成以".ODIN"扩展名结尾的文