问题: *将1到9这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍,问应当怎样分。 **输出格式要求:"No.%d: %d %d %d\n" 思路提示:对第一个3位数进行穷举,然后*2,*3分别得到另外两个数。再判断3个数的9个位是否有重复数据(建议把这9个数位分别求出后存入一维数组,再编写一个函数判断一维数组中是否有重复数据。)
//查找数组中是否有重复的数,并且记录下标:返回1代表有重复,0没有
int find_repet(int arr[], int n)
{
int num = 0;
int spot = 0;
int pos1, pos2;
for (int i = 0; i < n-1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (arr[i] == arr[j])//有重复的
{
pos1= i;//分别记录下标的位置
pos2= j;
num = arr[i]; //记录哪个数字重复了
spot = 1;//有重复为1
}
}
}
if (spot == 0)
{
return 0;
}
else
{
//printf("第%d个与第%d个相等,等于%d", pos1, pos2, num);//这里可以输出,以便观察使用
return 1;
}
}
void fcc(int* p1, int* p2, int* p3,int n)//函数2:判断九位数是否有重复
{
int arr[9];//存放数字的数组
int NU = 0;//计数器
for (int i = 0;i<n; i++)
{
arr[0] = p3[i] % 10;//个位
p3[i] /= 10;
arr[1] = p3[i] % 10;//十位
p3[i] /= 10;
arr[2] = p3[i] % 10;//百位
p3[i] = arr[2] * 100 + arr[1] * 10 + arr[0];//还原
arr[3] = p2[i] % 10;
p2[i] /= 10;
arr[4] = p2[i] % 10;
p2[i] /= 10;
arr[5] = p2[i] % 10;
p2[i] = arr[5] * 100 + arr[4] * 10 + arr[3];
arr[6] = p1[i] % 10;
p1[i] /= 10;
arr[7] = p1[i] % 10;
p1[i] /= 10;
arr[8] = p1[i] % 10;
p1[i] = arr[8] * 100 + arr[7] * 10 + arr[6];
//判断数组中的元素是否有重复
int flag = find_repet(arr, 9);
if (flag != 1)//条件判断
{
NU++;
printf("No.%d: %d %d %d\n",NU, p1[i], p2[i], p3[i]);
}
}
}
int func(int* p) //函数1:对于1-9构成的三位数进行穷举
{
int N=0,m= 0,n=0;
for (int i = 1; i < 10; i++)
{
for (int j = 1; j < 10; j++)
{
for (int k = 1; k < 10; k++)
{
if (i != j && j != k&&i!=k)//三个数字都不相等
{
N = i * 100 + j * 10 + k;//算出这个数字
if (N * 3 < 1000) //这里*3<1000是因为要找的数是三维数
{
p[m] = N;
m++;
n++;
}
}
}
}
}
return n;
}
int main()
{
int arr[1000] = { 0 };
int n = func(arr);//穷举三位数并且得到有多少
/*printf_arr(arr, n);//这里用来检验数据是否得到
printf("%d",n);*/
int brr[1000] = { 0 }, crr[1000] = { 0 };//这两个分别用来装*2和*3后的结果
for (int i = 0; i < n; i++)
{
brr[i] = arr[i] * 2;
crr[i] = arr[i] * 3;
}
fcc(arr, brr, crr,n);//判断是否有重复的,如果没有那么输出
return 0;
}
以上代码是对于题目的解答.
对于这道题主要由两个函数组成,我写了三个,为了更好看一些,第一个是对于数字的穷举,第二个是判断数组中是否有重复的元素,第三个在第二个基础上得到了九个数字.写成三个是因为,我觉得判断数组中是否有重复元素的函数比较常用,所以详细写了.以上就是我的分享,欢迎大家参考指正