洛谷 P1008三连击 C语言

先写自己最先开始的思路

算出一共有多少个三位数,将所有的三位数都装进一个数组里,然后一个一个遍历,如果这个三位数的两倍、三倍都在这个数组里,且三个三位数没有相同的数字,就输出。

第一个函数长这样:

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);
		}
	}
}

大佬赐予我力量!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值