落谷P1008
先贴我的代码:
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
int a[3];
int d,e,f;
for(int i=1;i<4;i++)
{
int n=0;
a[0]=i;
{
for(int j=1;j<10;j++)
{
n=0;
a[1]=j;
for(int k=1;k<10;k++)
{
n=0;
a[2]=k;
d=a[0]*100+a[1]*10+a[2];
e=d*2;
f=d*3;
if(f<998)
{
stringstream ss1,ss2,ss3;
string s,s1,s2,s3;
ss1<<d;
ss1>>s1;
ss2<<e;
ss2>>s2;
ss3<<f;
ss3>>s3;
s=s1+s2+s3;
for(int q=0;q<9;q++)
{
for(int p=q+1;p<9;p++)
{
if(s[q]-'0'==s[p]-'0'||s[p]-'0'==0||s[q]-'0'==0)
{
n=1;
break;
}
}
if(n==1)
break;
}//三个数无相等数字;
if(n==1)
continue;
else
cout<<d<<" "<<e<<" "<<f<<endl;
}
}
}
}
}
}
思路很简单(虽然不够简洁) 但我第一次测试的时候未能通过
仔细看了后发现我犯了一个低级错误——把n 在循环外初始化;
说来惭愧 这种错误也不是第一次犯了 所以记录在此 谨防再犯!
另外再次提醒自己牢牢记住如!何!将!字符串!与!数值!相互转化!
#include<sstream>
{
string s;
int a;
stringstream ss;
ss<<s;
ss>>a;//string to int;
ss<<a;
ss>>s;//int to string;
}
再贴网上找到的比较简洁的代码的关键部分:
{
int a[10],b,c,d;
int sum;
for(b=123;b<330;b++)
{
sum=0;
a[10]={0};
a[b%10]=1;
a[b/10%10]=1;
a[b/100]=1;
c=b*2;
a[c%10]=1;
a[c/10%10]=1;
a[c/100]=1;
d=b*3;
a[d%10]=1;
a[d/10%10]=1;
a[d/100]=1;
for(int i=1;i<10;i++)
sum+=a[i];
if(sum==9)
cout<<b<<" "<<c<<" "<<d<<endl;
}
return 0;
}
相比之下我的代码真是很笨拙、毫无技巧…
我完全没想过这种思路:引入数组并以数组值为1来代表对应数字出现了
一定要好好理解并记住
写在最后:
这是我的第一篇博客 这也是我决心学习算法的开始
路漫漫其修远兮
吾将上下而求索
现在很差 但一定会努力 使自己越来越好