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";} 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*/}

评论