您的位置:首页 > 其它

蓝桥杯寒假训练二1006相乘后数字不变

2018-02-26 19:37 141 查看
题目:
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
题目思路:
  一开始是自己的思路,但是比较曲折,我是这么想的,
first*second=result
把result的结果保存在一个数组里面主函数从第一个数first开始循环,对于每一个first找到所有的second使得 first*second<=9999,然后再判断first,second组成的数字都得在result中出现
这个想法有个漏洞
会出现下面这样的算式
/*45*187=8415
45*209=9405
46*138=6348

46*139=6394*/
再加上一个函数fun3(int i,int j)用来判断i,j是由四个数字组成的;
还有一个问题,怎么样避免重复呢 在这里可以直接加上一个 i<=j#include<iostream>
#include<cstring>
using namespace std;
int a[4];//用来保存这四位数
int b[4];//标记数组
int fun(int x)//把 四位数x 的个位数字存放在 a[4]中 并且四位数不同的话 返回1 有相同的话 返回0
{
int s=0;
while(x)
{
a[s++]=x%10;
x/=10;
}
for(int i=0;i<4;i++)
for(int j=i+1;j<4;j++)
{
if(a[i]==a[j])
return 0;
}
return 1;
}
void fun1(int x)
{
while(x)
{
int t=x%10;
for(int i=0;i<4;i++)
{
if(t==a[i])
b[i]=1;
}
x/=10;
}
}
int fun2(int x,int y)
{
int i=0;
while(x)
{
x/=10;
i++;
}
while(y)
{
y/=10;
i++;
}
return i;
}
int main()
{
int cnt;//计数
for(int i=2;i*i<=9999;i++) //* 前面的那个数字
{

int j=1000/i+1;//确保了 i*j肯定从四位数开始的 然后判断 i*j 的四位数是否相同以及 与i ,j 的数要一致
while(i*j<=9999)
{ memset(b,0,sizeof(b));
if(fun(i*j))
{
fun1(i);
fun1(j);
int ok=0;
for(int k=0;k<4;k++)// i,j中的数字 都得在reslut中出现,
{
if(b[k]==1)
ok++;
}
if(ok==4&&fun2(i,j)==4&&i<=j)
{cnt++;
cout<<i<<"*"<<j<<"="<<i*j<<endl;
}
}
j++;
}

}
cout<<cnt;
return 0;
}
/*45*187=8415
45*209=9405
46*138=6348
46*139=6394*/思路二
对右边的四位数进行循环,然后找到first,second 
先对四位数进行判断,要保证是不同的四位数,然后 要确保first,second 也是由四位数组组成的,再然后判定 组成first,second和组成result 的数字要相同#include<iostream>
using namespace std;
bool test(int res,int first,int second)//测试函数
{
int flag[4];
int p=0;
for(int i=0;i<4;i++)
{
flag[i]=res%10;
res/=10;
}
for(int i=0;i<4;i++) //res 要是不同的四位数
for(int j=i+1;j<4;j++)
{
if(flag[i]==flag[j])
return false;
}
int flag_1[20];//用来表示两个乘数 的每个数字
while(first>0)
{
flag_1[p]=first%10;
first/=10;
p++;
}
while(second>0)
{
flag_1[p]=second%10;
second/=10;
p++;
}
if(p!=4)//前面相乘的两个数的位数和一定要得是 4位
{
return false;//如果 不是四位数直接退出,
}
else//左边这四位数要和 右边的四位数相同 这就暗含了左边的四位数是互不相同的
{
for(int i=0;i<4;i++)
{
for(int j=i+1;j<4;j++)
{
if(flag_1[i]==flag_1[j])
return false;
}
}
for(int i=0;i<4;i++)
{
int ye=0;
for(int j=0;j<4;j++)
{
if(flag[i]==flag_1[j])
ye=1;
}
if(ye==0)
return false;
}

return true;
}

}
int main()
{
int first,second;
int cnt=0;
for(int i=1000;i<=9999;i++)
{
for(int j=1;j*j<=i;j++)//避免重复
{
if(i%j==0)
{
first=j;
second=i/j;
if(test(i,first,second))
cnt++;
}
}
}
cout<<cnt;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  寒假训练