题目通道
题解代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool vis;
int n;
void dfs(unsigned __int64 x,int n,int k){
if(vis) return;
if(x%n==0){
printf("%I64u\n",x);
vis=true;
return;
}
if(k==19) return;
dfs(x*10,n,k+1);
dfs(x*10+1,n,k+1);
}
int main(){
while(scanf("%d",&n)){
if(n==0) break;
vis=false;
dfs(1,n,0);
}
return 0;
}
64 位 int用法。
__int64 a;
cin >> a;
cout << a;
scanf("%I64d",&a);
printf("%I64d",a);
使用无符号数时,将"%lld"改成"%llu"即可。
作为一个特例,如果你使用的是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。
不同写法
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
bool ok= 0 ;
inline void dfs(unsigned long long ans ,int n,int index) {
if ( ok ) return ;
if (index==20) return;
if ( ans % n == 0 ){
cout<<ans<<endl;
ok = 1;
return ;
}
dfs( ans*10, n ,index+1);
dfs( ans*10+1, n ,index+1);
}
int main(){
// freopen("1.txt","r",stdin);
int n;
while ( scanf("%d",&n) == 1 && n ){
ok = 0;
dfs(1,n,1);
}
return 0;
}
拓展写法
#include<iostream>
#include<cstring>
using namespace std;
int n,k;//k 开关
int a[10000];
inline void print(int dep){
for (int i = 1; i <= dep; i++)
printf("%d",a[i]);
cout<<endl;
return;
}
void dfs(unsigned long long ans,int n,int index,int left)//ans 答案 n mod index 位数
{
if(k==0)return;
if(index==21)return;//范围
if(left%n==0)//数据过水不需要大整数
{
cout<<ans<<endl;
// print(index-1);
k=0;
return;
}
a[index] = 0 ;
dfs(10*ans,n,index+1,(left*10)%n);//奇数
a[index] = 1 ;
dfs(10*ans+1,n,index+1,(left*10+1)%n);//偶数
}
int main()
{
// freopen("1.txt","r",stdin);
while(scanf("%d",&n)&&n!=0)
{
k=1;
memset(a,0,sizeof(a));
a[ 1 ] = 1;
dfs(1,n,2,1);
}
return 0;
}
最佳写法
#include<iostream>
#include<cstring>
using namespace std;
int n,k;//k 开关
int a[10000];
inline void print(int dep){
for (int i = 1; i <= dep; i++)
printf("%d",a[i]);
cout<<endl;
return;
}
void dfs(unsigned long long ans,int n,int index,int left)//ans 答案 n mod index 位数
{
if(k==0)return;
if(index==21)return;//范围
if(left%n==0)//数据过水不需要大整数
{
// cout<<ans<<endl;
print(index-1);
k=0;
return;
}
a[index] = 0 ;
dfs(10*ans,n,index+1,(left*10)%n);//奇数
a[index] = 1 ;
dfs(10*ans+1,n,index+1,(left*10+1)%n);//偶数
}
int main()
{
// freopen("1.txt","r",stdin);
while(scanf("%d",&n)&&n!=0)
{
k=1;
memset(a,0,sizeof(a));
a[ 1 ] = 1;
dfs(1,n,2,1);
}
return 0;
}