编写程序,将1到9这九个数字分成三个三位数,要求:第2个三位数是第1个三位数的两倍;第3个三位数是第1个

#include <stdio.h>
int a[9];
int OK(int t,int *s)
{
int *p,*q;
for(p=s; p<s+3 ;p++)
{
*p=t%10;
t=t/10;
for(q=a;q<p;q++) 这里为什么这样写没看明白
if(*p= =0|| *q==*p ) return(0);
}
}
main()
{int m,count=0;
for(m=123;m<=333;m++)
if(OK(m,a)&&OK(2*m,a+3)&&OK(3*m,a+6)) 这里a,a+3,a+6什么意思没看懂
printf("NO. %d:%d %d%d\n",++count,m,2*m,3*m);
}

先回答后面一个
根据定义int a[9];来看,a是指针,指向整型数组a的第1个元素
a+3和a+6也都是指针,分别指向整型数组a的第4个元素和第7个元素

前面那个问题回答起来要麻烦些,因为你要理解了算法的思路才知道代码是想做什么。

首先这个算法是要枚举,范围设置在123~333想必不难理解吧。
现在我举其中一些例子来说明算法思路。
当第一个数等于123时,根据题意,后两个数分别为246和369
先把123拆成数字1,2,3写到数组a的前三个元素中,并且验证写进去的数字都不等于0而且互不相等(这就是你问的*p==0,以及*q==*p的意思)
如果出现0,不在1~9之间自然不行,出现了重复的数字也不符合题意,所以只要出现这两种情况中的任何一种,就要return 0,表示这个数字不行。
当然,1,2,3既没有0也没有重复,所以接下来将246的每一位写到a数组接下来的三个元素中,现在a数组变成了1 2 3 2 4 6
当对第四个元素2进行*q==*p判断时发现与第二个元素相等,所以123肯定不能是第一个数。于是循环到m=124,再重复上面的过程。
如果发现一直到第九个数字都既没有出现0也没有重复,那么满足题意,输出,同时计数。

当然,程序中也有不严谨的地方。比如OK函数检验到出现0和出现重复时返回了0,但是当外层for循环结束时应该有return(1);这样的语句,不然main函数中的if语句永远也判断不出true,所以还需要改进。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-31

这个问题我想了挺久的,有许多方法,最终权衡了一下用数组来做比较好,难点在于要判断三个三位数中的个十百位都不能相等。我的思路是先用循环遍历第一个三位数,然后用第一个三位数与之后两个三位数的关系求出他们,再判断这三个三位数是否符合个十百位互不相等的题目要求。

具体代码如下:(程序附有注释)


#include <stdio.h>
#include<stdlib.h>

int Tput (int a,int b,int c);
void Tsplit (int a, int b[]);
int Ifequal( int a[],int b[] );

main()
{
int i, j, k ;  //循环变量
int a[]={0,1,2,3,4,5,6,7,8,9};  //储存10个个位数
int t1 ;  //第一个三位数三位数
int t2 ;  //第二个三位数三位数
int t3 ;  //第三个三位数三位数

//用三重循环遍历数组a中的元素,生成不同的首个三位数
for(i=1;i<4;i++)  //人为减少第一重循环次数,i作为百位不会大于400
{
for(j=0;j<10;j++)
{
//保证首个三位数是由互不相同的三个数组成
if(i==j)
continue;
for(k=0;k<10;k++)
{
//保证是互不相同的三个数
if(j==k || i==k)
continue;
t1=Tput(a[i],a[j],a[k]);  //生成三位数
//保证第一个三位数的有效性(如果大于1000第三个数就不是三位数)
if(t1*3<1000)
{
int b[3]={0};  //存储第二个三位数的数字组成
int c[3]={0};  //存储第三个三位数的数字组成
int d[3]={a[i],a[j],a[k]};  //存储第一个三位数的数字组成
t2=2*t1;
t3=3*t1;
//将第二第三个三位数分开,存在数组中
Tsplit(t2,b);
Tsplit(t3,c);
//分别判断三个三位数中的元素是否相等,并输出
if(Ifequal(b,c) && Ifequal(b,d) && Ifequal(c,d))
printf("%d,%d,%d\n",t1,t2,t3);
}
}
}
}
system("pause");
}

//函数功能:按顺序输入百十个位,输出一个三位数
int Tput (int a,int b,int c)
{
return a*100+b*10+c;
}

//函数功能:输入一个三位数与数组(存储拆分的三位数),拆分为三个数(按百十个位)
void Tsplit (int a, int b[])
{
int i;
for(i=0;i<3;i++)
{
b[i]=a%10;
a=a/10;
}
}

//函数功能:输入两个数组,判断两个数组中的元素是否互不相等,是返回1,不是返回0
int Ifequal( int a[],int b[] )
{
int i,j;
int flag=1;  //判断变量
//判断数组内部元素是否相等
if(a[0]==a[1] || a[0]==a[2] || a[1]==a[2])
flag=0;
if(b[0]==b[1] || b[0]==b[2] || b[1]==b[2])
flag=0;
//判断两个元素之间的元素是否相等
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(a[i]==b[j])
flag=0;
}
}
return flag;
}

第2个回答  2013-03-21
xsyhzhb1991 所言甚是
相似回答