蓝桥杯——产生数

题目描述
给出一个整数  n(n< 10^30)  和  k  个变换规则(k< =15)。 

规则: 

一位数可变换成另一个一位数: 

规则的右部不能为零。 

例如:n=234。有规则(k=2): 

2->   5 

3->   6 

上面的整数  234  经过变换后可能产生出的整数为(包括原数): 

234 

534 

264 

564 

共  4  种不同的产生数 

问题: 

给出一个整数  n  和  k  个规则。 

求出: 

经过任意次的变换(0次或多次),能产生出多少个不同整数。 

仅要求输出个数。 
输入
n  k 
x1  y1 
x2  y2 
...  ... 
xn  yn 
输出
一个整数(满足条件的个数)
样例输入
234  2 
2  5 
3  6 
样例输出

4

思路:将规则描述成为一个完整的邻接矩阵,找各个节点的邻接节点数+1(包括自身),将所有点的邻接节点数最后相乘既是最后答案。

 
 
import java.math.BigInteger;
import java.util.Scanner;


public class 产生数 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int k=sc.nextInt();
		//将输入的数字转化为字符数组
		char chn[]=String.valueOf(n).toCharArray();
		int map[][]=new int[10][10];
		//录入规则,a->b
		for (int i = 1; i <=k; i++) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			map[a][b]=1;
		}
		//根据规则,更新每个数字能链接到的节点
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map.length; j++) {
				for (int div = 0; div < map.length; div++) {
					if(div!=i && div!=j && i!=j){
						if(map[i][div]==1 && map[div][j]==1){
							map[i][j]=1;
						}
					}
				}
			}
		}
		BigInteger sum=BigInteger.ONE;//初始化“总的可能情况数”
		for (int i = 0; i < chn.length; i++) {
			int x=chn[i]-'0';//转化成int的节点下标
			int count=1;//初始化为1是因为,最后可能的数中包含自身,所以自身也是一种情况
			for (int j = 0; j < map.length; j++) {
				if(map[x][j]==1){//符合规则可以交换(走通)
					count+=map[x][j];//计算每一位数字最多能变为几种数字
				}
			}
			String ss=String.valueOf(count);
			sum=sum.multiply(new BigInteger(ss));
		}
		System.out.println(sum);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,带分可以用分类来表示。下面是一个简单的带分类的实现: ```java public class Fraction { private int integer; private int numerator; private int denominator; public Fraction(int integer, int numerator, int denominator) { this.integer = integer; this.numerator = numerator; this.denominator = denominator; simplify(); } private void simplify() { if (numerator < 0 && denominator < 0) { numerator = -numerator; denominator = -denominator; } if (denominator < 0) { numerator = -numerator; denominator = -denominator; } if (integer < 0 && numerator > 0) { numerator = -numerator; } if (integer < 0 && numerator == 0) { integer = -integer; } if (numerator >= denominator) { integer += numerator / denominator; numerator = numerator % denominator; } int gcd = gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } private int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } public Fraction add(Fraction other) { int newNumerator = this.numerator * other.denominator + other.numerator * this.denominator; int newDenominator = this.denominator * other.denominator; int newInteger = this.integer + other.integer; return new Fraction(newInteger, newNumerator, newDenominator); } public String toString() { if (integer == 0 && numerator == 0) { return "0"; } String result = ""; if (integer != 0) { result += integer; if (numerator != 0) { result += "_"; } } if (numerator != 0) { result += numerator + "/" + denominator; } return result; } } ``` 这个带分类实现了以下功能: - 构造函可以根据整部分、分子和分母创建一个带分对象。 - simplify() 方法可以将带分对象化简,如将负号移到分子上、将整部分和真分部分合并、将分化简等。 - add() 方法可以将两个带分对象相加,返回一个新的带分对象。 - toString() 方法可以将带分对象转换为字符串形式。 这个类实现了带分的加法操作,可以参考这个类来实现其他的运算操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值