2005年9月12日电脑报第36期编程点将
题目:请编程实现将1到9 这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍。问应当怎样分法。
首先,我认为题目是错的。
原题:请编程实现将1到9 这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍。
按这样编的话应该是没有结果的,
我认为应该是:
第一个3位数,是第三个3位数的三倍,而第二个数是第三个数的两倍。
按修改后的题目:以下是我的程序:
程序的主要思想参考我的c语言程序设计百例的第60题,不过里面的题目也是错的,好像电脑报今年的编程点将有90%取自里面的题目。
/*算法思想:根据题意,最小的三位数m可能是在123-333之间,因此循环取尽这些值,
并由此计算出最大的三位数为:3*m,第二个数为:2*m(按原题应该是:3*m/2)。然后判断每个三位数
的各个位是否有重复,没有的话就完成了任务。当然,可能的分发不止一种,
我们采用count来计算可能的分法并输出来
*/
#include<iostream>
using namespace std;
int ok(int t,int *z);//判断每个三位数的各个位是否已经被取过
int A[9];//存放从小到大的三个三位数的各个位
void 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)) /*若满足题意*/
cout<<"第"<<++count<<"种可能的三个数是:"<<3*m<<" "<<2*m<<" "<<m<<"\n";
}
并由此计算出最大的三位数为:3*m,第二个数为:2*m(按原题应该是:3*m/2)。然后判断每个三位数
的各个位是否有重复,没有的话就完成了任务。当然,可能的分发不止一种,
我们采用count来计算可能的分法并输出来
*/
#include<iostream>
using namespace std;
int ok(int t,int *z);//判断每个三位数的各个位是否已经被取过
int A[9];//存放从小到大的三个三位数的各个位
void 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)) /*若满足题意*/
cout<<"第"<<++count<<"种可能的三个数是:"<<3*m<<" "<<2*m<<" "<<m<<"\n";
}
int ok(int t,int *z) /*取得t的各个位的值,将其存入z指向的三个数组元素,若满足要求返回1*/
{
int *p1,*p2;
for(p1=z;p1<z+3;p1++)
{
*p1=t%10; /*分解整数*/
t/=10;
for(p2=A;p2<p1;p2++) /*查询分解出的数字是否已经出现过*/
if(*p1==0||*p2==*p1)return 0; /*若重复则返回*/
}
return 1; /*没有重复返回1*/
}
{
int *p1,*p2;
for(p1=z;p1<z+3;p1++)
{
*p1=t%10; /*分解整数*/
t/=10;
for(p2=A;p2<p1;p2++) /*查询分解出的数字是否已经出现过*/
if(*p1==0||*p2==*p1)return 0; /*若重复则返回*/
}
return 1; /*没有重复返回1*/
}
评论