我的程序有什么问题——从1-9里求abc:def:ghi=1:2:3的题

ScytheV 2010-12-17 04:50:28
题目是这样的,不重复的1-9个元素组成abc,def和ghi,要求abc:def:ghi=1:2:3。我没有想到别的解决方法,用了下面最笨的方法,可是还是有错误,运行时会输出重复元素组成的三个数。我已经尽我所能了,可依然没有解决这个问题,所以我拿上来问问大家,请大家帮忙。

另,对于这个问题,有没有不这么笨的方法?


#include <stdio.h>
bool diff(int *a,int n) //判断a数组是否有相同元素,若无,返回true
{
for(int i=0;i<n-1;++i)
for(int j=i+1;j<n;++j)
if(a[i]==a[j])
return false;
return true;
}
int main()
{
int num[10],first;
for(int a=1;a<=9;++a)
for(int b=1;b<=9;++b)
for(int c=1;c<=9;++c)
for(int d=1;d<=9;++d)
for(int e=1;e<=9;++e)
for(int f=1;f<=9;++f)
for(int g=1;g<=9;++g)
for(int h=1;h<=9;++h)
for(int i=1;i<=9;++i)
{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
num[5]=f;
num[6]=g;
num[7]=h;
num[8]=i;
if(diff(num,9))
{
first=a*100+b*10+c; //算出第一个元素,即abc
printf("%d %d %d\n",first,first*2,first*3); //可由abc得到def和ghi
}
}
}
...全文
302 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
黯淡蓝点 2011-09-07
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,x=0,a[10],sum=0;
for(i=123;i<=329;i++)
{
a[0]=i/100;
a[1]=i%100/10;
a[2]=i%10;
a[3]=(2*i)/100;
a[4]=(2*i)%100/10;
a[5]=(2*i)%10;
a[6]=(3*i)/100;
a[7]=(3*i)%100/10;
a[8]=(3*i)%10;
for(int k=0;k<8;k++)
{
for(int r=k+1;r<9;r++)
{
if(a[k]==a[r])
x++;
}
}
for(int j=0;j<9;j++)
{
sum+=a[j];
if(sum==45&&x==0)
printf("%d\t%d\t%d\t\n",i,2*i,3*i);
}
sum=0;
x=0;
}
system("pause");
return 0;
}
速度还行。
rollthewong 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guolijun_12304108 的回复:]
first=a*100+b*10+c; //算出第一个元素,即abc
printf("%d %d %d\n",first,first*2,first*3); //可由abc得到def和ghi


first*2,first*3是由first得到的,你能保证first,first*2,first*3中的元素是不重复的吗?

你只是保证first中没有重复的元素。

如果按照你代码编写……
[/Quote]

不是由diff()保证了num[]的所有元素都不重复么?

不过你启发了我,我改成了下面这样:


{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
num[5]=f;
num[6]=g;
num[7]=h;
num[8]=i;
first=a*100+b*10+c; //算出第一个元素,即abc
second=d*100+e*10+f;
third=g*100+h*10+i;
if(diff(num,9)&&first*3==third&&first*2==second)
{
printf("%d %d %d\n",first,second,third); //可由abc得到def和ghi
}
}


程序很慢,不过可以运行出正确结果了。
guolijun_12304108 2010-12-18
  • 打赏
  • 举报
回复
first=a*100+b*10+c; //算出第一个元素,即abc
printf("%d %d %d\n",first,first*2,first*3); //可由abc得到def和ghi


first*2,first*3是由first得到的,你能保证first,first*2,first*3中的元素是不重复的吗?

你只是保证first中没有重复的元素。

如果按照你代码编写的程序执行,你的结果会有362880种。真正的结果没有这么多吧。
luciferisnotsatan 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]

你应该先找个全排列的代码看看,然后你的问题就搞定了
[/Quote]
+1
rollthewong 2010-12-18
  • 打赏
  • 举报
回复
@4楼:
我觉得应该不用algorithm库来解这道题,这题的提示是“不要太费脑筋”,所以我想肯定有巧妙又不难想到的方法。

@5楼:
我一开始试的就是这个方法,也失败了。肯定是我程序有问题。

@楼上所有:
我主要是想麻烦大家看看这段代码有什么问题,因为我没看出问题,可运行结果错误,这让我很疑惑。这段代码很短,看一看花不了一分钟吧。
witlym311 2010-12-17
  • 打赏
  • 举报
回复
算法肯定有问题啊,就是做出来了也不会被认可的,因为没有达到要求啊!
ChanseyJack 2010-12-17
  • 打赏
  • 举报
回复
我是这样算的:
用3个For把第一行的数历遍,后两行的用乘法得出
然后用3个函数,分别检验1.有没有0 2.三位数里有没有重复的数字 3.三个三位数之间有没有重复的数字
cranium 2010-12-17
  • 打赏
  • 举报
回复

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
char number[] = "123456789";

cout<<"abc def ghi\n-----------\n";
while(next_permutation(number,number+9))
{
char buff[4];
buff[3] = 0;
strncpy_s(buff,number,3);
int abc = atoi(buff);
strncpy_s(buff,number+3,3);
int def = atoi(buff);
strncpy_s(buff,number+6,3);
int ghi = atoi(buff);

if(abc*2 ==def && abc*3==ghi)
cout<<abc<<' '<<def<<' '<<ghi<<'\n';
}
return 0;
}

/*
abc def ghi
-----------
192 384 576
219 438 657
273 546 819
327 654 981
请按任意键继续. . .
*/
iq02006 2010-12-17
  • 打赏
  • 举报
回复
有 用搜索算法,用回溯简单点
healer_kx 2010-12-17
  • 打赏
  • 举报
回复
你应该先找个全排列的代码看看,然后你的问题就搞定了
healer_kx 2010-12-17
  • 打赏
  • 举报
回复
传说中的9层循环。

33,317

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧