`
Simone_chou
  • 浏览: 192845 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Prime Cryptarithm(枚举)

 
阅读更多
Prime Cryptarithm

The following cryptarithm is a multiplication problem that can be solved by substituting digits from a specified set of N digits into the positions marked with *. If the set of prime digits {2,3,5,7} is selected, the cryptarithm is called a PRIME CRYPTARITHM.

      * * *
   x    * *
    -------
      * * *         <-- partial product 1
    * * *           <-- partial product 2
    -------
    * * * *

Digits can appear only in places marked by `*'. Of course, leading zeroes are not allowed.

Note that the 'partial products' are as taught in USA schools. The first partial product is the product of the final digit of the second number and the top number. The second partial product is the product of the first digit of the second number and the top number.

Write a program that will find all solutions to the cryptarithm above for any subset of digits from the set {1,2,3,4,5,6,7,8,9}.

PROGRAM NAME: crypt1

INPUT FORMAT

Line 1: N, the number of digits that will be used
Line 2: N space separated digits with which to solve the cryptarithm

SAMPLE INPUT (file crypt1.in)

5
2 3 4 6 8

OUTPUT FORMAT

A single line with the total number of unique solutions. Here is the single solution for the sample input:

      2 2 2
    x   2 2
     ------
      4 4 4
    4 4 4
  ---------
    4 8 8 4

SAMPLE OUTPUT (file crypt1.out)

1

   题意:

   有N个数,使这N个数满足以上的乘法法则,并且乘出来的每个数都在给出的这N个数中。

 

   思路:

   在已给出的数中一个个列举出来再乘起来判断,满足条件则sum积累。

 

   AC:

 

/*
TASK:crypt1
LANG:C++
ID:sum-g1
*/
#include<stdio.h>
#include<stdlib.h>
int number[15];
int n;

int test(int a,int b)
{
	int k,temp=0;
	while(a)
	{
		for(k=0;k<n;k++)
		 if((a%10)==number[k]) {temp++;break;}
		a/=10;
	}
	if(temp==b)  return 1;
	else         return 0;
}
//test用来测试乘起来的这些数是否在已给出的数中
//a代表这个数,b代表位数
int main()
{
freopen("crypt1.in","r",stdin);
freopen("crypt1.out","w",stdout);	
int i,first,second;
	int t1,t2,t3,t4,t5;
	int sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&number[i]);
	for(t1=0;t1<n;t1++)
	{
		for(t2=0;t2<n;t2++) 
//一开始手抽写成t2<0,导致循环不能进行,要细心!
		{
			for(t3=0;t3<n;t3++)
			{
				first=number[t1]*100+number[t2]*10+number[t3];
//列举这三位数,使它变成一个整数,非一个个字符
				for(t4=0;t4<n;t4++)
				{
					if(number[t4]*first>999) continue;
					if(!test(number[t4]*first,3)) continue;
					for(t5=0;t5<n;t5++)
					{
					second=number[t4]*10+number[t5];
//列举这两位数,使它变成一个整数,非一个个字符
					if(number[t5]*first>999) continue;
//超过3位数在排除
					if(!test(number[t5]*first,3)) continue;
//不是已给出的数则排除
					if(second*first>9999||!test(second*first,4)) continue;
//乘出来的数不是4位数,或者这个4位数不是已给出的数
					if(second*first<9999&&second*first>1000&&test(second*first,4))  sum++;
//是4位数,且是给出的数,则sum积累
					}
				}
			}
		}
	}
	printf("%d\n",sum);
	exit(0);
}

   更优化的办法:

   换种角度思考来列举,既然已经规定第一个数为3位数,第二个数为2位数,则三位数 i 从100列举到999,二位数 j 从10到99。仅仅只需要两重循环,并且满足条件即可:

   1.判断这个数是否由已给出的数所组成;

   2.判断这个两位数个位和十位分别与 这个满足条件1的三位数 i 相乘是否都是三位数,并且是否满足1条件;

   3.满足1和2条件下,将i与j相乘,得出的数result是否为一个4位数,并且是否满足条件1。

   下面的技巧在于用数组0,1标记这个数是否存在。

/*
TASK:crypt1
LANG:C++
ID:sum-g1
*/
#include<stdio.h>
int hash[15]={0};
int n;

int test(int a)
{
	while(a)
	{
	 if(!hash[a%10]) return 0;  
//记得要%10 
	 a/=10;
    }
    return 1;
}

int main()
{
freopen("crypt1.in","r",stdin);
freopen("crypt1.out","w",stdout);	
int number,i,j;
	int first,second,sum=0,result;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&number);
		hash[number]=1;
	}	
	for(i=100;i<1000;i++)
	{
		if(!test(i)) continue;
		for(j=10;j<100;j++)
		{
			if(!test(j)) continue;
			first=(j%10)*i;
			second=(j/10)*i;
			if(first<100||first>999||second>999||second<100)   continue;
			if(!test(first)||!test(second)) continue;
			result=i*j;
			if(!test(result)||result>9999||result<1000)  continue;
			sum++;
		}
	}
	printf("%d\n",sum);
}

   总结:

   当题目的条件比较多时,应一一列举出来,细心分析归纳,理清好思路非常重要。题目看起来好像很麻烦的样子,但是仔细分析的话其实也只是多了几个条件而已,数据看起来很庞大,但是当写完出来之后发现也只不过是这样而已。有时候做题往往就是被这种表面的东西吓到了,所以不愿去尝试,必须去习惯做这类枚举的题目,尝试总比什么都不做要好。

分享到:
评论

相关推荐

    LynX_Prime_Interface.rar_lynx prime_lynx vega_vega_vega prime_ve

    《LynX Prime Interface——深度探索Vega Prime模块的运用》 在当今的IT领域,高效的数据处理和分析工具是必不可少的。LynX Prime Interface与Vega系列产品的结合,为用户提供了强大的计算能力和灵活的模块化设计,...

    WXH_eprime_E-prime情绪图片刺激_eprime图片刺激_

    在本案例中,“WXH_eprime_E-prime情绪图片刺激_eprime图片刺激”标题表明这是一个利用E-Prime进行情绪图片刺激实验的设计。下面将详细阐述E-Prime的基本功能、情绪图片刺激实验的设计原理及其实现方法。 E-Prime是...

    USACO官网93题fps格式 OJ题库

    USACO 官网第一到 五章 练习题中文语言官方数据 fps格式支持导入所有OJ 1 [1.1] 你的飞碟在这儿 Your Ride Is Here...12 [1.3] 牛式 Prime Cryptarithm 13 [1.3] 虫洞 wormhole 14 [1.3] 滑雪课程设计Ski Course Design

    E-Prime程序示例.zip

    E-Prime示例集E-Prime示例集E-Prime示例集E-Prime示例集E-Prime示例集E-Prime是由卡奈基-梅龙大学和匹兹堡大学联合开发心理学实验操作平台,是一个高等的图形设计环境,提供革命性的新工具,以加速实验发展,E-Prime...

    E-Prime软件+安装方法+教程

    E-Prime是一款强大的实验设计与数据收集工具,广泛应用于心理学、认知科学以及神经科学等领域。它的主要功能包括创建实验流程、呈现视觉和听觉刺激、记录反应时间以及处理实验数据等。下面将详细介绍E-Prime的软件...

    Eprime 2.0安装包.rar

    EPrime 2.0是一款广泛应用于心理学、神经科学和社会科学研究的心理实验设计与数据收集软件。它的全称是Experimental Prime,由Psychology Software Tools (PST) 公司开发,为研究者提供了强大的实验构建工具,使得非...

    心理学eprime制作flanker实验

    EPrime是一款专为心理学实验设计的软件,它允许研究人员创建、控制并记录各种心理实验,包括经典的Flanker任务。在本实验中,我们将探讨EPrime如何被用来构建一个Flanker任务,这是一种常用于研究注意力、执行功能和...

    prime95使用教程.pdf

    Prime95是一款专门用于CPU稳定性测试的工具,由著名软件开发者George Woltman开发,主要用于检测计算机系统的稳定性,特别是CPU的耐受性。这款软件的名字来源于其主要功能——计算梅森质数(Mersenne primes),这是...

    Vega Prime V5.0 入门教程

    Vega Prime V5.0是一款著名的商业化视景仿真软件,提供从简单到复杂的场景模拟,广泛应用于航空、军事、航海、城市模拟等多个领域。V5.0版本的Vega Prime入门教程将向读者介绍如何使用这款强大的软件来创建和管理...

    E-prime安装包

    E-Prime是一款专为实验心理学设计的软件工具,它提供了强大的实验设计和数据收集功能,是研究人员和学生进行心理实验的重要助手。E-Prime 2.0版本在前一代的基础上进行了许多改进,使得实验设计更加直观易用,同时也...

    Presagis 仿真软件Vega Prime 18.0参考手册

    《Presagis 仿真软件Vega Prime 18.0参考手册》是针对该专业级仿真软件的重要参考资料,旨在帮助用户全面了解并有效利用Vega Prime 18.0的各项功能。该手册包含了多种格式,如CHM(Microsoft HTML Help)和PDF,以...

    E-prime实验设计技术(曾祥炎)

    ### E-Prime实验设计技术知识点概述 #### 1. E-Prime的发展背景 E-Prime是一种广泛应用于心理实验研究的计算机软件,它的出现是为了应对早期心理实验计算机化过程中的缺陷和挑战。20世纪50至60年代,随着计算机技术...

    电力线载波PRIME协议

    PRIME协议(PoweRline Intelligent Metering Evolution),即智能电表电力线通信的演进,是由PRIME联盟(PRIME Alliance)开发的电力线载波通信标准。PRIME协议基于正交频分复用(Orthogonal Frequency Division ...

    PrimeTime PX User Guide

    ### PrimeTime PX 用户指南知识点概览 #### 一、PrimeTime PX 概述 - **定义与作用**:PrimeTime PX 是由 Synopsys 公司开发的一款高性能静态时序分析(STA)工具,用于集成电路设计中的时序验证。它在确保设计符合...

    primesense Sensor-Win64-5.1.6.6

    标题“primesense Sensor-Win64-5.1.6.6”指的是PrimeSense公司为64位Windows操作系统设计的一款传感器驱动程序,版本号为5.1.6.6。PrimeSense是一家专注于3D感知技术和硬件开发的公司,其产品广泛应用于机器人导航...

    EPRIME 实例集

    EPRIME(Experimental Prime Research and Interactive Media Environment)是一款在心理学实验设计和数据收集领域广泛应用的软件。它允许研究人员创建复杂的实验程序,以测试各种认知和感知现象。以下将详细讲解...

    E-prime珍贵教程

    **E-Prime珍贵教程** E-Prime是一种专为心理学实验设计和执行的软件,由Psychology Software Tools公司开发。这个“E-prime珍贵教程”针对的是想要深入理解并使用E-Prime系统的初学者。E-Prime的核心功能在于帮助...

    Eprime 2.0安装包(original).zip

    EPrime是一款专为心理学实验设计的强大软件,尤其在认知心理学领域广泛应用。EPrime 2.0是该软件的第二个主要版本,提供了许多增强的功能和改进,使得实验设计、执行和数据分析更加便捷。以下是对EPrime 2.0及其重要...

    Prime Time中文教程

    ### Prime Time中文教程知识点概述 #### 一、绪论与背景 - **集成电路设计的发展**:随着集成电路(IC)向VLSI(Very Large Scale Integration)和ULSI(Ultra Large Scale Integration)发展,其规模迅速扩大到几...

    Eprime统计准确率.doc

    Eprime 统计准确率 Eprime 是一款功能强大且广泛应用于心理学、神经科学、社会科学等领域的实验设计和数据采集软件。下面是 Eprime 统计准确率的相关知识点: 一、Eprime 安装 Eprime 的安装过程非常简单。首先,...

Global site tag (gtag.js) - Google Analytics