正文

2005年9月12日电脑报第36期编程点将2005-09-12 20:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/4694.html

分享到:

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

阅读(5767) | 评论(5)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册