}
intmain()
{inti,a[8],b[8],min=0,max=0,n;
cout<<"输入正整数个数(ocin>>n;
cout<<"输入整数"<for(i=0;icin>>a[i];
paixu(a,n);
cout<for(i=0;i{b[i]=i+1;
min=min+b[i]*pow(10,n-i-1);
max=max+b[i]*pow(10,i);
}
for(i=min;i<=max;i++)
{if(kebukeyishuchu(i,n)==1)
continue;
if(kebukeyishuchu(i,n)==0)
shuchu(i,a,n);
}
return0;
}
四、C阶乘问题
(1)题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!
=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600
12的阶乘最右边的非零位为6。
写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。
注意:
10,000,000!
有2499999个零。
(2)输入要求
仅一行,包含一个正整数N。
(3)输出要求
单独一行,包含一个整数表示最右边的非零位的值。
(4)样例输入
12
(5)样例输出
6
#include
usingnamespacestd;
intmain()
{inti,t,n;
cout<<"输入需要计算的阶乘数"<cin>>n;
t=1;
for(i=1;i<=n;i++)
{t=t*i;
for(;t%10==0;t=t/10)
;
t=t%10;
}
cout<<"整数最右边非零位的值"<return0;
}
这个题会在15,35这几种5尾数的结果后面出现bug,然后我已经想不到了。
五、Yushi难题
(1)题目描述
有一位著名的数学家叫Yushi,他提出了一个世纪难题:
给定一个正整数N,由1,2……,N组成的集合
S0={1,2,3,……,N}
对于任意给定的集合,定义集合的和为集合中所有元素的和。
集合S0可以被划分为两个不相交的子集合S1,S2。
分别对这两个集合求和,如果两个集合的和相差恰好为K,则记为一种合法的划分方法。
考虑N=7,K=0,则合法划分方法一种有4种:
{{1,2,4,7},{3,5,6}};{{1,2,5,6},{3,4,7}};{{1,6,7},{2,3,4,5}};{{1,3,4,6},{2,5,7}}
对于给定的N和K,求出集合的划分方法总数。
(2)输入要求
仅含一行,两个整数N(1(3)输出要求
仅含一个数,表示划分集合的合法方案数。
(4)样例输入
70
(5)样例输出
4
六、搬寝室
(1)题目描述
在大学的寝室里面,大家可根据自己的学号选择床号。
如果某同学的学号是a,并且有0..k-1一共k张床,那么他就会选择a%k号床作为他的床位。
显然,两个人不能睡在一张床上。
那么给出所有同学的学号,请你为他们准备一间卧室,使得里面的床的数量最少。
(2)输入要求
第一行是人数n(1<=n<=5,000);第2到第n+1行是每个同学的学号Si(1<=Si<=1,000,000)。
(3)输出要求
仅一行,是最少的床的数目。
(4)样例输入
5
4
6
9
10
13
(5)样例输出
8
#include
usingnamespacestd;
intmain()
{inta[100],b[100];
intn,i,j,k;
cin>>n;
boolchuangzuishao=true;
for(i=0;icin>>a[i];
for(k=2;;k++)
{chuangzuishao=true;
for(i=0;ib[i]=(a[i])%k;
for(i=0;i{for(j=i+1;j{if(b[i]==b[j])
chuangzuishao=false;
}
}
if(chuangzuishao==true)
break;
}
cout<return0;
}
这个应该也是没有问题的。
七、确定进制
(1)题目描述
6+9=12对于十进制来说是错误的,但是对于13进制来说是正确的。
即,6(13)+9(13)=12(13),而12(13)=1×131+2×130=15(10)。
你的任务是写一段程序读入三个整数p、q和r,然后确定一个进制B(2<=B<=16)使得p+q=r。
如果B有很多选择,则输出最大的一个。
如果没有合适的进制,则输出0。
(2)输入要求
要求输入可有T组测试样例。
T在第一行给出。
每一组测试样例占一行,包含三个整数p、q、r。
p、q、r的所有位都是数字,并且1<=p、q、r<=1,000,000。
(3)输出要求
对于每组测试样例输出一行,且包含一个整数:
即使得p+q=r成立的最大的B。
如果没有合适的B,则输出0。
(4)样例输入
3
111116
9811
6912
(5)样例输出
0
16
13
#include
#include
usingnamespacestd;
intshuzhi(inta,intb)
{inti,t=0;
for(i=0;a/10!
=0||a%10!
=0;a=a/10,i++)
t=t+a%10*pow(b,i);
returnt;
}
intceshi(intp,intq,intr)
{intB,t=0,a,b,c;
for(B=2;B<=16;B++)
{a=shuzhi(p,B);
b=shuzhi(q,B);
c=shuzhi(r,B);
if(a+b==c)
t=B;
}
returnt;
}
intmain()
{inta[500][3];
inti,j,n,jieguo;
cout<<"测试样的组数"<cin>>n;
for(i=0;ifor(j=0;j<3;j++)
cin>>a[i][j];
for(i=0;i{jieguo=ceshi(a[i][0],a[i][1],a[i][2]);
cout<}
return0;
}
这个题应该也是没有问题的。
八、相似基因
(1)题目描述
众所周知,人类基因可以看作一个碱基对序列,它包含了4种核苷酸,简记为A,C,G,T。
让我们观察这样一段基因序列“ACCAGGTT”,这段序列共由8个核苷酸构成,其中第1位和第4位是碱基‘A’,第2位和第3位是碱基‘C’,第5位和第6位是碱基‘G’,第7位和第8位是碱基‘T’。
Tom构造了这样一个0,1矩阵:
1,0,0,1,0,0,0,0
0,1,1,0,0,0,0,0
0,1,1,0,0,0,0,0
1,0,0,1,0,0,0,0
0,0,0,0,1,1,0,0
0,0,0,0,1,1,0,0
0,0,0,0,0,0,1,1
0,0,0,0,0,0,1,1
如果第i位的碱基与第j位的碱基一样,那么0,1矩阵的i行j列为1,否则为0。
如果基因序列X与基因序列Y等长且具有相同的0,1矩阵,Tom就会认为X与Y是相似的基因序列。
现在的问题是:
给你两段长度为N的基因序列,请你帮助Tom判断它们是否相似。
(1)输入要求
可以有多组测试数据,每组数据第1行输入一个正整数N(1≤N≤1000000),第2行和第3行分别输入两段长度为N的基因序列(只由A,C,G,T四种字符构成)。
输入直至N=0为结尾。
(2)输出要求
每组数据输出仅一行,如果相似则输出“YES”,否则输出“NO”,注意双引号不需要输出。
(3)样例输入
2
AA
TG
6
ACCGTT
GAATCC
0
(3)样例输出
NO
YES
#include
usingnamespacestd;
intmain()
{intN,i,j,k;
chara[2][100];
intb[100][100];
intc[100][100];
cin>>N;
for(;N!
=0;)
{boolxiangshi=true;
for(i=0;i<2;i++)
for(j=0;jcin>>a[i][j];
for(i=0;i<2;i++)
{for(j=0;j{for(k=0;k{if(a[0][j]==a[0][k])
b[j][k]=1;
if(a[1][j]==a[1][k])
c[j][k]=1;
}
}
}
for(j=0;j{for(k=0;k{if((b[j][k])!
=c[j][k])
{xiangshi=false;
break;
}
}
}
if(xiangshi==true)
cout<<"YES"<else
cout<<"NO"<cin>>N;
}
return0;
}
这个题是没有问题的。
九、团伙
(1)题目描述
在某城市里住着N个人,任何两个认识的人不是朋友就是敌人,而且满足:
1、我朋友的朋友是我的朋友;
2、我敌人的敌人是我的朋友;
所有是朋友的人组成一个团伙。
告诉你关于这N个人的M条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
(2)输入要求
第一行包含一个整数N,第二行包含一个整数M,1接下来M行描述M条信息,内容为以下两者之一:
“FXY”表示X与Y是朋友;“EXY”表示X与Y是敌人。
其中1<=X,Y<=N。
(3)输出要求
包含一个整数,即可能的最大团伙数。
(4)样例输入
6
4
E14
F35
F46
E12
(5)样例输出
3
然而这道题我已经醉了。
#include
usingnamespacestd;
intmain()
{inti,N,j,M,k,b[100],tuanhuoshu=0,h;
intmin,max;
chara[100];
intc[100][2];
cin>>N>>M;
for(i=0;ib[i]=1;
for(i=0;i{cin>>a[i];
for(j=0;j<2;j++)
cin>>c[i][j];
}
for(i=0;i{if(a[i]=='F')
{min=c[i][0]c[i][0]:
c[i][1];
max=c[i][0]>c[i][1]?
c[i][0]:
c[i][1];
b[min-1]=b[min-1]+b[max-1];
b[max-1]=0;
}
}
for(i=0;icout<
cout<for(i=0;i{for(j=i+1;j{if(a[i]=='E'&&a[j]=='E')
{for(k=0;k<2;k++)
{for(h=0;h<2;h++)
{if(c[i][k]==c[j][h])
{if(c[i][1-k]>c[j][1-h])
{b[c[j][1-h]-1]+=b[c[i][1-k]-1];
b[c[i][1-k]-1]=0;
}
if(c[i][1-k]{b[c[i][1-k]-1]+=b[c[j][1-h]-1];
b[c[j][1-h]-1]=0;
}
}
}
}
}
}
}
for(i=0;icout<
cout<for(i=0;i{if(b[i]!
=0)
tuanhuoshu++;
}
cout<return0;
}
这个应该是可以的。
十、选课
(1)题目描述
学校实行学分制。
每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。
学校开设了N门的选修课程,学生有M天的时间学习。
学生花一定量的天数选修一门课并考核通过就能获得相应的学分。
在选修课程中,有一门课程可以直接选修,其它课程则需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。
例如《数据结构》必须在选修了《C++程序设计》之后才能选修。
我们称《C++程序设计》是《数据结构》的先修课。
每门课的直接先修课最多只有一门。
两门课也可能存在相同的先修课。
每门课都有一个课号,依次为1,2,3,…。
你的任务是为自己确定一个选课方案,使得你能得到的学分最多,并且必须满足先修课优先的原则。
假定课程之间不存在时间上的冲突。
希望你能合理分配时间,获得尽量多的学分。
(2)输入要求
输入共N+1行。
第一行共两个数N、M,由空格隔开。
含义如前述。
第2至N+1行,每行共三个数p,t,v由空格隔开。
第i+1行为第i门选修课的信息(不用输入课号)。
p表示i的先修课课号,t表示修i所需天数,v表示i的学分。
若p=0则表示i可以直接选修,没有先修课。
(3)输出要求
输出共一行,且只有一个数,即最多修多少学分。
(4)样例输入
524
595
31010
0710
272
371
(5)样例输出
22
#include
usingnamespacestd;
intmain()
{intN,M,i,j,day=0,wokeyixuede=0,xuefen=0;
cin>>N>>M;
inta[50][3];
boolshijianbugoule=false;
for(i=0;ifor(j=0;j<3;j++)
cin>>a[i][j];
for(;shijia