2014年蓝桥杯c组省题 神奇算式 枚举

72 阅读3分钟

视频:2014年C++C组题6神奇算式_哔哩哔哩_bilibili

1.神奇算式 - 蓝桥云课 (lanqiao.cn)

枚举四位数的每一位数的值,枚举×号的所有的 位置。

把我们求出来的值转换成字符串进行比较

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;

int cnt;
bool check(int  src,int dst)
{
	string src_str,dst_str;
	stringstream ss;
	ss<<src;   //读取整数
	ss>>src_str;   //转换为字符串
	
	
	stringstream ss1;
	ss1<<dst;   //读取整数
 	ss1>>dst_str;  //转换为字符串
 	
	
	//对两个字符串进行排序是按照ASCII排
	sort(src_str.begin(),src_str.end());
	sort(dst_str.begin(),dst_str.end());
	
	//比较两个字符串是否一样
	if(src_str==dst_str)return true;
	
	return false;
	
}
int main()
{
  for(int i=1;i<10;i++)
  {
  	for(int j=0;j<10;j++)
  	{
  		if(j!=i)
	  	for(int m=0;m<10;m++)
	  	{
	  		if(m!=i&&m!=j)
		  	for(int n=0;n<10;n++)
		  	{
			  if(n!=m&&n!=j&&n!=i)
			  {
			  	int src=i*1000+j*100+m*10+n;
			  	
			  	//x号在第一个位置
			 
			  	
				  int r1=i*(j*100+m*10+n);
				  	if(check(src,r1))
	  				  {
	  				  	printf("%d * %d\n",i,j*100+m*10+n);
	  				  	cnt++;
	  				  }
				  
			 
			  	
			  	//x号在第二个位置
			  	
				  	int r2=(i*10+j)*(m*10+n);
  				  	if(check(src,r2))
	  				  {
	  				  		printf("%d * %d\n",i*10+j,m*10+n);
	  				  	cnt++;
	  				  }
				  

			  	
			  	//x号在第三个位置
			  	
			  	
  		  	        int r3=(i*100+j*10+m)*n;
	  			  	if(check(src,r3))
	  				  {
	  				  	printf("%d * %d\n",i*100+j*10+m,n);
	  				  	cnt++;
	  				  }
				  }
		
			  
			  	
			  }
		  }
	  }
  }
  
  cout<<cnt<<endl;
  return 0;
}

image.png

Debug

解决不是四位数的问题;

当×号在第一个数后面的时候有这样一种情况:

比如现在有四位数1023

那么src=1023, r1=1*(1000+0100+210+3)=1

但是我们实际上想要r1的结果是1023,因此我们要保证当×号在第一位数后面的时候第二位数上的值不能为0,否则会影响结果。

当然,当×号在第2位数后面的时候,第三位上的数也不能为0.

答案

最后因为乘法交换率的2问题,我们要把最后的结果除以2

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;

int cnt;
bool check(int  src,int dst)
{
	string src_str,dst_str;
	stringstream ss;
	ss<<src;   //读取整数
	ss>>src_str;   //转换为字符串
	
	
	stringstream ss1;
	ss1<<dst;   //读取整数
 	ss1>>dst_str;  //转换为字符串
 	
	
	//对两个字符串进行排序是按照ASCII排
	sort(src_str.begin(),src_str.end());
	sort(dst_str.begin(),dst_str.end());
	
	//比较两个字符串是否一样
	if(src_str==dst_str)return true;
	
	return false;
	
}
int main()
{
  for(int i=1;i<10;i++) //注意第一位数字不能为0,即不能出现0264这种值
  {
  	for(int j=0;j<10;j++)
  	{
  		if(j!=i)
	  	for(int m=0;m<10;m++)
	  	{
	  		if(m!=i&&m!=j)
		  	for(int n=0;n<10;n++)
		  	{
			  if(n!=m&&n!=j&&n!=i)
			  {
			  	int src=i*1000+j*100+m*10+n;
			  	
			  	//x号在第一个位置
			 
			  	if(j!=0)
			  	{
		  		  int r1=i*(j*100+m*10+n);
			  	  if(check(src,r1))
  				  {
  				  	printf("%d * %d\n",i,j*100+m*10+n);
  				  	cnt++;
  				  }
				}
			
				  
			 
			  	
			  	//x号在第二个位置
			  	
			  	if(m!=0)
			  	{
	  			  	  int r2=(i*10+j)*(m*10+n);
					  if(check(src,r2))
	  				  {
	  				  		printf("%d * %d\n",i*10+j,m*10+n);
	  				  	cnt++;
	  				  }
				  }
		
				  

			  	
			  	//x号在第三个位置
			  	
			  	
			  	
  		  	        int r3=(i*100+j*10+m)*n;
	  			  	if(check(src,r3))
	  				  {
	  				  	printf("%d * %d\n",i*100+j*10+m,n);
	  				  	cnt++;
	  				  }
				  }
		
			  
			  	
			  }
		  }
	  }
  }
  
  cout<<cnt/2<<endl;
  return 0;
}