正文

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

阅读(17256) | 评论(5)


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

评论

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