没有人知道吗?
我报出21-201中的一个数字,你给我7个数字,这7个数字相加等于我报出的数字,而且这7个数字在1-36之间,怎么算? 问题点数:20、回复次数:16Top
1 楼ed9er(始祖鸟)回复于 2001-03-02 20:48:00 得分 0
是不是不多不少刚好7个?能不能重复?
Top
2 楼digiling(Turing)回复于 2001-03-02 22:22:00 得分 0
可以重复,必须刚好7个数字Top
3 楼donaldduck(冰雪笑容)回复于 2001-03-02 22:25:00 得分 0
编程思路:
1。不要用循环来求,那样至少要不得36的5次方,计算量很大。
2。采取以36为一个单位的选择,预先给它定好可能出现的值。
以下程序在BC++3.1下通过。(我没有时间验证它的可靠性如有问题请告诉我)
#include <iostream.h>
#include <conio.h>
void main(void)
{
int temp,i,Num[7];
for(i=0;i<7;i++) Num[i]=3;
temp=0;
cout<<"Please input the number here:"<<endl;
cin>>temp;
if(temp>20&&temp<57) { Num[5]=5; Num[6]=temp-20;}
if(temp>56&&temp<93) { Num[0]=Num[1]=Num[2]=Num[3]=Num[4]=4;
Num[5]=36;Num[6]=temp-56; }
if(temp>92&&temp<129) { Num[0]=Num[1]=Num[2]=Num[3]=5;
Num[4]=Num[5]=36;Num[6]=temp-92; }
if(temp>128&&temp<165) { Num[0]=Num[1]=7;Num[2]=6;
Num[3]=Num[4]=Num[5]=36;Num[6]=temp-128; }
if(temp>164&&temp<202){ Num[0]=Num[1]=10;
Num[2]=Num[3]=Num[4]=Num[5]=36;Num[6]=temp-164;
if(temp==201)Num[0]=Num[1]=11,Num[6]=temp-166; }
if(temp<21||temp>201) { cout<<"You Input wrong number"<<endl;
temp=0; }
if(temp!=0)
for(i=0;i<7;i++)
cout<<Num[i]<<"\t";
getch();
}
Top
4 楼ed9er(始祖鸟)回复于 2001-03-02 23:26:00 得分 2
可以重复??不知道我是不是想的太简单了:
#include <stdio.h>
main() {
int i, j;
scanf( "%d", &i );
for (j = 0; j < (7-i%7); j++)
printf("%d,",i/7);
for (j = 0; j < i%7; j++)
printf("%d,", i/7 + 1);
printf("\n");
}
Top
5 楼digiling(Turing)回复于 2001-03-03 01:15:00 得分 0
唉,都不对:(
一个数可以是好几组7个数字之和
Top
6 楼ed9er(始祖鸟)回复于 2001-03-03 02:13:00 得分 0
听不懂Top
7 楼donaldduck(冰雪笑容)回复于 2001-03-03 07:22:00 得分 0
你是要所有可能的组合吗?Top
8 楼donaldduck(冰雪笑容)回复于 2001-03-03 08:44:00 得分 0
下面的程序可以计算出所有的组合,而且按大小排序。
解轻了计算量,避免了重复。
// Using BC++3.1
#include<iostream.h>
#include<conio.h>
int a[7],n;
int collate(int);//比较,确定
void main(void) {
int i;
cin>>n;
for(a[0]=1;a[0]<37&&collate(1);a[0]++)
for(a[1]=a[0];a[1]<37&&collate(2);a[1]++)
for(a[2]=a[1];a[2]<37&&collate(3);a[2]++)
for(a[3]=a[2];a[3]<37&&collate(4);a[3]++)
for(a[4]=a[3];a[4]<37&&collate(5);a[4]++)
for(a[5]=a[4];a[5]<37&&collate(6);a[5]++)
for(a[6]=a[5];a[6]<37&&collate(7);a[6]++) //按大小来排序,避免重复
if(collate(7)==2){
for(i=0;i<7;i++) cout<<a[i]<<"\t";
getch(); cout<<endl;}
}
int collate(int i) {
int temp=0,j;
for(j=0;j<i;j++)
temp+=a[j];
if(temp>n) return 0;
else if(temp==n) return 2;
else return 1;
}
Top
9 楼digiling(Turing)回复于 2001-03-03 09:53:00 得分 0
donaldduck(丰臣秀吉)的答案有点接近了,但在同一组里,7个数字是不能重复的呀,eg;只能是 1 2 3 4 5 6 7 而 不是 1 1 1 1 7 8 8 9 Top
10 楼vcyzq(逸轩)回复于 2001-03-03 10:21:00 得分 0
关注!Top
11 楼donaldduck(冰雪笑容)回复于 2001-03-03 10:30:00 得分 17
但是
1+2+3+4+5+6+7=28 !!!!
21~27怎么办呀,
但是 :0+1+2+3+4+5+6=21
所以 ,如果可以为零的话只须稍微的修改一下我的程序:
//Using BC++3.1
#include<iostream.h>
#include<conio.h>
int a[7],n;
int collate(int);
void main(void) {
int i,j;
cin>>n;
for(a[0]=0;a[0]<37&&collate(1);a[0]++)
for(a[1]=a[0]+1;a[1]<37&&collate(2);a[1]++)
for(a[2]=a[1]+1;a[2]<37&&collate(3);a[2]++)
for(a[3]=a[2]+1;a[3]<37&&collate(4);a[3]++)
for(a[4]=a[3]+1;a[4]<37&&collate(5);a[4]++)
for(a[5]=a[4]+1;a[5]<37&&collate(6);a[5]++)
for(a[6]=a[5]+1;a[6]<37&&collate(7);a[6]++)//无重复,按序
if(collate(7)==2){
for(i=0;i<7;i++) cout<<a[i]<<"\t";
getch(); cout<<endl;}
}
int collate(int i) {
int temp=0,j;
for(j=0;j<i;j++)
temp+=a[j];
if(temp>n) return 0;
else if(temp==n) return 2;
else return 1;
}
如果不可以为零,请把小于28的分开来讨论,再修改第一个for循环为:
for(a[0]=1;a[0]<37&&collate(1);a[0]++)
Top
12 楼vcyzq(逸轩)回复于 2001-03-03 10:37:00 得分 1
to digiling(Turing):
你的表达能力欠缺,你的题目当中没有说不准重复,而且,你只说了7个数字,两组的话不是有14个数字了???我刚才编了一个,好像没有找到这7个数字,嘻嘻!(忙了老半天).Top
13 楼vcyzq(逸轩)回复于 2001-03-03 10:47:00 得分 0
donaldduck(丰臣秀吉):
我服了u,多谢指点!好像第7行的那个j要去掉哦!Top
14 楼donaldduck(冰雪笑容)回复于 2001-03-03 11:02:00 得分 0
是呀,我忘了~~~
一开始我以为会用到呢Top
15 楼donaldduck(冰雪笑容)回复于 2001-03-03 11:05:00 得分 0
多谢逸轩兄鼓励。
我刚来,还要前辈们多多支持。Top
16 楼digiling(Turing)回复于 2001-03-04 15:45:00 得分 0
多谢donaldduck(丰臣秀吉) ,加分~~~~~~Top




