落谷P1008三连击(C++)

落谷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来代表对应数字出现了
一定要好好理解并记住

写在最后:
这是我的第一篇博客 这也是我决心学习算法的开始
路漫漫其修远兮
吾将上下而求索
现在很差 但一定会努力 使自己越来越好

猜你喜欢

转载自blog.csdn.net/QH_WYH/article/details/89475968