题目:
思路:参考队友的代码,学了打表;一直以为是自己的方法太暴力,反思超时也不能一组数据也过不了。
后来让别人检查错误原因是,6位数组开小了,数组下标是从0开始的,0,1,2,3,4,5,6,至少得开7位的数组啊
AC代码
队友的打表法
#include <bits/stdc++.h>
using namespace std;
int x;
int a[6];
bool vis[10000000],vv[10];
int i,b;
void dabiao()
{
for(i=123455;i<=987655;i++)
{
memset(vv,0,sizeof(vv));
int flag=1;
int x=i;
while(x>0)
{
b=x%10;
x=x/10;
if(b==0||i%b!=0||vv[b])//新学到的标记是否出现
{
flag=0;
break;
}
vv[b]=1;
}
if(flag==0) continue;
else if(flag==1) vis[i]=1;
}
}
int main()
{
ios::sync_with_stdio(0);
int l,h;
cin>>l>>h;
memset(vis,0,sizeof(vis));
dabiao();//打表把所有结果列出来
int sum=0;
for(int i=l; i<=h; i++)
{
if(vis[i])sum++;//需要判断某一值时直接利用打表的结果
}
cout<<sum<<endl;
return 0;
}
参考别人的代码
#include <bits/stdc++.h>
using namespace std;
int x;
int f(int x)
{
int vis[20]= {0};
int now=x;
while(now)
{
if(now%10==0)
{
return 0;
break;
}
if(vis[now%10])
{
return 0;
break;
}
if(x%(now%10)!=0)
{
return 0;
break;
}
vis[now%10]=1;
now /=10;
}
return 1;
}
int main()
{
ios::sync_with_stdio(0);
int l,h;
cin>>l>>h;
int sum=0;
for(int i=l; i<=h; i++)
{
if(f(i))sum++;
}
cout<<sum<<endl;
return 0;
}
自己的AC代码
太不容易了
#include <bits/stdc++.h>
using namespace std;
int x;
int a[10];
int f(int x)
{
int t=x;
int j;
int flag=1;
for(j=1; j<=6; j++)
{
a[j]=x%10;
x=x/10;
if(a[j]==0)
{
flag=0;
break;
}
else if(t%a[j]!=0)
{
flag=0;
break;
}
}
for(int m=1;m<=6;m++)
{
for(int n=m+1;n<=6;n++)
{
if(a[m]==a[n]){ flag=0;break;}
}
}
if(flag==1) return 1;
else return 0;
}
int main()
{
ios::sync_with_stdio(0);
int l,b;
cin>>l>>b;
int sum=0;
for(int i=l; i<=b; i++)
{
if(f(i)==1)sum++;
}
cout<<sum<<endl;
return 0;
}