先写自己最先开始的思路
算出一共有多少个三位数,将所有的三位数都装进一个数组里,然后一个一个遍历,如果这个三位数的两倍、三倍都在这个数组里,且三个三位数没有相同的数字,就输出。
第一个函数长这样:
int Jadge1(int number,int a[N])
//判断 number 是否在数组 a 里面
{
int n=0;
for(int i=0;i<N;i++)
{
if(number==a[i])
{
n=1;
break;
}
}
if(n==1)
return 1;
else
return 0;
}
第二个函数长这样:
int Jadge2(int a,int b,int c)
//判断 a,b,c 三个数是否有相同的数字
{
int i1,i2,i3,j1,j2,j3,k1,k2,k3;
i1=a/100;
i2=b/100;
i3=c/100;
j1=(a%100)/10;
j2=(b%100)/10;
j3=(c%100)/10;
k1=a%10;
k2=b%10;
k3=c%10;
int num2[9]={i1,i2,i3,j1,j2,j3,k1,k2,k3};
//两个 for 循环遍历数组的同时与其他元素进行比较,查找是否有相同元素
int count=0;
for(int i=0;i<9;i++)
{
for(int j=i+1;j<9;j++)
{
if(num2[i]==num2[j])
count++;//查找到相同的计数器加 1
}
}
if(count==0)//没有找到相同的 count=0
return 1;
else
return 0;
}
主函数长这样:
int main()
{
//1~9的九个数,随机组成三个三位数,要求形成1:2:3的比例
//随机能组成多少数 123 124 125 126 127 128 129 132 134 135 136 137 138 139 142 ...
//共有 9*8*7=504 个
int num[N];
int i,j,k;
int n=0;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
if(i!=j)
{
for(k=1;k<10;k++)
{
if(i!=k && j!=k)
{
num[n]=i*100+j*10+k;
//所有数装进数组
n++;
}
}
}
}
}
//最大的数是987,它的1/3是329,只要遍历到第125个数。
for(int m=0;m<125;m++)
{
int m1,m2;
m1=2*num[m];
m2=3*num[m];
int n1=Jadge1(m1,num);//判断两倍是否在数组里
int n2=Jadge1(m2,num);//判断三倍是否在数组里
int n3=Jadge2(num[m],m1,m2);//判断三个三位数是否有相同数
if(n1&&n2&&n3)//如果三个条件都满足,则输出
{
printf("%d %d %d",num[m],m1,m2);
printf("\n");
}
}
}
所以整个函数长这样:
#include<stdio.h>
#define N 504
int Jadge1(int number,int a[N])
//判断 number 是否在数组 a 里面
{
int n=0;
for(int i=0;i<N;i++)
{
if(number==a[i])
{
n=1;
break;
}
}
if(n==1)
return 1;
else
return 0;
}
int Jadge2(int a,int b,int c)
//判断 a,b,c 三个数是否有相同的数字
{
int i1,i2,i3,j1,j2,j3,k1,k2,k3;
i1=a/100;
i2=b/100;
i3=c/100;
j1=(a%100)/10;
j2=(b%100)/10;
j3=(c%100)/10;
k1=a%10;
k2=b%10;
k3=c%10;
int num2[9]={i1,i2,i3,j1,j2,j3,k1,k2,k3};
int count=0;
for(int i=0;i<9;i++)
{
for(int j=i+1;j<9;j++)
{
if(num2[i]==num2[j])
count++;
}
}
if(count==0)
return 1;
else
return 0;
}
int main()
{
//1~9的九个数,随机组成三个三位数,要求形成1:2:3的比例
//随机能组成多少数 123 124 125 126 127 128 129 132 134 135 136 137 138 139 142 ...
//共有 9*8*7=504 个
int num[N];
int i,j,k;
int n=0;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
if(i!=j)
{
for(k=1;k<10;k++)
{
if(i!=k && j!=k)
{
num[n]=i*100+j*10+k;
//所有数装进数组
n++;
}
}
}
}
}
//最大的数是987,它的1/3是329,只要遍历到第125个数。
for(int m=0;m<125;m++)
{
int m1,m2;
m1=2*num[m];
m2=3*num[m];
int n1=Jadge1(m1,num);
int n2=Jadge1(m2,num);
int n3=Jadge2(num[m],m1,m2);
if(n1&&n2&&n3)//判断输出的条件
{
printf("%d %d %d",num[m],m1,m2);
printf("\n");
}
}
}
后来看了大神解题
直接定义一个数 a,从123遍历到333,并求出它的两倍(b)和三倍(c)。判断 a,b,c 三个三位数没有共同数字的方法,属实让我大吃一惊。
#include<stdio.h>
int main()
{
int a,b,c;
// a 从123到333
for(int a=123;a<333;a++)
{
b=2*a;
c=3*a;
if(a/100+b/100+c/100+(a%100)/10+(b%100)/10+(c%100)/10+a%10+b%10+c%10==45 && (a/100)*(b/100)*(c/100)*((a%100)/10)*((b%100)/10)*((c%100)/10)*(a%10)*(b%10)*(c%10)==362880)
//45是1~9相加的值,362880是1~9相乘的值
{
printf("%d %d %d\n",a,b,c);
}
}
}
大佬赐予我力量!