蓝桥杯2014-6 奇怪的分式(+暴力枚举)

本文探讨了多个数学算法问题,包括分数简化、数字排列组合及加法算式解析,使用枚举法和最大公约数概念解决复杂问题。

2014-6奇怪的分式

题目描述

    对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?请写出所有不同算式的个数(包括题中举例的)。

    显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

    但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

int g1 = gcd(a*c, b*d);

int g2 = gcd(a*10+c, b*10+d);

if( a*c/g1 == (a*10+c)/g2  &&  b*d/g1== (b*10+d) /g2 )

tips:判断条件这样写也可以 if( (a*c)*(b*10+d)==(b*d)*(a*10+c) )

(1)、枚举法

int main(int argc, const char *argv[])
{
	int ans = 0;
	int f=0;
	int a,b,c,d;
	for(a=1; a<10; a++)
	{
		for(b=1; b<10; b++)
		{
			if(a!=b)
			for(c=1; c<10; c++)
			{
				for(d=1; d<10; d++)
				if(c!=d)
				{
					int g1 = gcd(a*c, b*d);
					int g2 = gcd(a*10+c, b*10+d);
                    //注意判断条件的算数运算符优先级 
					if( a*c/g1==(a*10+c)/g2  &&  b*d/g1==(b*10+d)/g2 )
					{
						ans++;
						printf("%d %d %d %d\n",a,b,c,d);
					}
					
				}
			}
		}
	}
	cout<<ans<<endl;
}
//ans  14

注意判断条件的算数运算符优先级 

(2).最大公约数

判断两个分式是否相等。

辗转相除法:gcd(a,b)=gcd(b,amodb)    a,b的最大公约数就是b,a mod b的最大公约数。

//循环表示
int gcd(int a, int b)
{
	while(b!=0){
		int t = b;
		b = a%b;
		a = t;	
	}
	return a;
}
//递归表示
int gcd(int a, int b){
	if(b==0) return a;
	return gcd(b, a%b);
} 

 

2013-2-马虎的算式

 36 * 495 = 396 * 45 = 17820
 27 * 594 = 297 * 54
  a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

暴力枚举     if(( a*10+b )*( c*100+d*10+e ) == ( a*100+d*10+b )*( c*10+e ))

int main(int argc, const char *argv[]){
	int a,b,c,d,e;
	int ans=0;
	for( a=1 ; a<10 ; a++ )
	{
		for( b=1 ; b<10; b++)
		{
			if(b!=a)
			for( c=1 ; c<10 ; c++ )
			{
				if( c!=a && c!=b )
				for( d=1 ; d<10 ; d++ )
				{
					if( d!=a && d!=b && d!=c  )
					for( e=1 ; e<10 ; e++ )
					{
						if( e!=a && e!=b && e!=c && e!=d )
						{
							//ab * cde = adb * ce
							if(( a*10+b )*( c*100+d*10+e ) == ( a*100+d*10+b )*( c*10+e ))
							{
								printf("%d%d * %d%d%d = %d%d%d * %d%d\n ",a,b,c,d,e,a,d,b,c,e);
								ans++;
							}
								
						}
					}
				}
			}
			
		}
	}
	printf("%d",ans);
	return 0;

}

 

2015-3-三羊献瑞

三羊献瑞

观察下面的加法算式:相同的汉字代表相同的数字,不同的汉字代表不同的数字

      祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------
   三 羊 生 瑞 气

 abcd + efgb = efcbh    枚举法 

if(( a*1000+b*100+c*10+d ) + ( e*1000+f*100+g*10+b ) == e*10000+f*1000+c*100+b*10+h)

/*  
   a:祥  不含0 
   b:瑞
   c:生
   d:辉
   e:三   不含0 
   f:羊
   g:献
   h:气 

*/
#include<stdio.h>
#include<iostream>
int main(int argc, const char *argv[])
{
	int a,b,c,d,e,f,g,h;
	for( a=1; a<=9; a++)
	{
		for( b=0; b<=9; b++)
		{
			if(b!=a)
			for( c=0; c<=9; c++)
			{
				if( c!=a && c!=b )
				for( d=0; d<=9; d++)
				{
					if( d!=a && d!=b && d!=c  )
					for(e=1; e<=9; e++)
					{
						if( e!=a && e!=b && e!=c && e!=d )
						for(f=0; f<=9; f++)
						{
							if( f!=a && f!=b && f!=c && f!=d && f!=e )
							for(g=0; g<=9; g++)
							{
								if( g!=a && g!=b && g!=c && g!=d && g!=e && g!=f )
								for(h=0; h<=9; h++)
								{
									if( h!=a && h!=b && h!=c && h!=d && h!=e && h!=f && h!=g )
									//abcd + efgb = efcbh 
									if(( a*1000+b*100+c*10+d ) + ( e*1000+f*100+g*10+b ) == e*10000+f*1000+c*100+b*10+h)
									{
										printf("%2d%d%d%d\n",a,b,c,d);
										printf("%2d%d%d%d\n",e,f,g,b);
										printf("%d%d%d%d%d\n",e,f,c,b,h);
										printf("\n");
									}	
								}
							}
						}
					}
				}
			}
		}
	}
}

/* 9567    三羊献瑞:1085
   1085
  10652*/

 

 

计算数列 1 - 1/2 + 1/3 - 1/4 + …… + 1/n 求和有以下几种方法: ### 循环判断法 通过循环遍历从 1 到 n 的每个数,根据数的奇偶性来决定是加上还是减去其倒数。以下是 Python 代码示例: ```python n = 100 sum = 0 for i in range(1, n + 1): if i % 2 == 1: sum += 1 / i else: sum -= 1 / i print(sum) ``` 这种方法的思路来源于根据数列规律,分母为奇数的分式为正,分母为偶数的分式为负,通过判断奇偶性进行不同的运算,与计算 1/1 - 1/2 + 1/3 - 1/4 + 1/5 …… + 1/99 - 1/100 的思路一致 [^1]。 ### 符号标志法 使用一个标志变量来控制正负号的变化,在每次循环时改变标志的正负。以下是 C 语言代码示例: ```c #include <stdio.h> int main() { int n = 100; double flag = 1.0; double sum = 0.0; int d = 1; while (d <= n) { sum += 1 * flag / d; flag = -flag; d++; } printf("%lf", sum); return 0; } ``` 此方法通过不断改变标志变量的正负,实现了分式正负的交替运算,与计算 1/1 - 1/2 + 1/3 - 1/4 + 1/5 …… + 1/99 - 1/100 的第二种 while 循环方法类似 [^5]。 ### 分别求和法 将奇数项和偶数项分别求和,然后用奇数项的和减去偶数项的和。以下是 C 语言代码示例: ```c #include <stdio.h> int main() { int n = 100; float sum1 = 0.0; float sum2 = 0.0; for (int i = 1; i <= n; i += 2) { sum1 = sum1 + 1.0 / i; } for (int j = 2; j <= n; j += 2) { sum2 = sum2 + 1.0 / j; } float sum = sum1 - sum2; printf("%f\n", sum); return 0; } ``` 该方法是根据分母的奇偶性将数列拆分为两部分分别求和,最后做差得到结果,和总结 1/1 - 1/2 + 1/3 - 1/4 + 1/5 …… + 1/99 - 1/100 的方法一思路相同 [^3]。 ### 通用循环法 使用一个通用的循环,通过一个变量来控制正负号的交替。以下是 C 语言代码示例: ```c #include <stdio.h> int main() { int n = 10000; float a = 1.0, b = 1.0, sum = 0.0; int i = 1; while (i <= n) { a = 1.0 / i * b; sum += a; b = b * -1; i++; } printf("%f", sum); return 0; } ``` 此方法通过变量 b 来控制正负号的交替,不断更新分式的正负,从而实现数列的求和,与计算 1 - 1/2 + 1/3 - 1/4 + …… + 1/99 - 1/100 + …… + 1/n 的思路一致 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值