视频:2014年C++C组题6神奇算式_哔哩哔哩_bilibili
枚举四位数的每一位数的值,枚举×号的所有的 位置。
把我们求出来的值转换成字符串进行比较
#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;
}
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;
}