ProblemA 求N以内的素数
题目描述:
求N以内(包括N)的素数。(N<=100000)
输入
N
输出
N以内的所有素数,一个素数占一行。
样例输入
100
样例输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i = 2;i<=n;i++){
bool flag = true;
for(int j = 2;j<=i/j;j++){
if(i%j == 0){
flag = false;
break;
}
}
if(flag)
cout<<i<<endl;
}
return 0;
}
ProblemB 水仙花数
题目描述:
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=111+555+333
现在要求输出所有在m和n范围内的水仙花数。
输入:
两个整数m和n(100<=m<=n<=999)。
输出:
要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no。
样例输入
300 380
样例输出
370 371
#include <iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
bool flag = false;
for(int i = m;i<=n;i++){
int a = i%10;
int b = (i/10)%10;
int c = i/100;
if(a*a*a+b*b*b+c*c*c == i){
flag = true;
cout<<i<<" ";
}
}
if(!flag)
cout<<"no"<<endl;
}
ProblemC 汽水瓶
题目描述:
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1≤n≤100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出 0
样例输入
3
10
81
0
样例输出
1
5
40
#include <iostream>
using namespace std;
int main(){
int num;
while(1){
cin>>num;
if(num == 0)
break;
if(num<3){
cout<<0<<endl;
return 0;
}
int sum = 0;
while(num>=3){
sum += num/3;
num = num/3+num%3;
}
if(num == 2){
sum += 1;
}
cout<<sum<<endl;
}
return 0;
}
ProblemD 数列
题目描述:
小明今天在做数学题的时候碰到这样一个问题,一个数列的定义如下:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7。
现在给你A,B和n的值,请问你f(n)的值是多少?
输入:
输入包含多组测试数据。
每组输入3个整数A,B和n(1<=A,B<=1000,1<=n<=100000000),当输入的3个数都为0时,输入结束。
输出:
对于每组输入,输出f(n)的值。
样例输入
1 1 3
1 2 10
0 0 0
样例输出
2
5
#include <iostream>
using namespace std;
int func(int a,int b,int n){
if(n == 1)
return 1;
else if(n == 2)
return 1;
else
return (a*func(a,b,n-1)+b*func(a,b,n-2))%7;
}
int main(){
int a,b,n;
while(1){
cin>>a>>b>>n;
if(a == 0)
break;
cout<<func(a,b,n)<<endl;
}
return 0;
}
ProblemE 二叉排序树的基本操作
题目描述:
二叉排序树或者是一棵空树,或者是具有以下几条性质的二叉树:
-
若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
-
若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;
-
它的左右子树也分别为二叉排序树。
二叉排序树又可以被称为二叉查找树,根据上述定义的结构不难知道,它的查找过程十分简单,只需要通过不断的将当前结点的值与需要查找的值进行比较,如果相等则直接输出,如果要查找的值更小则深入至左子树进行比较,否则就深入右子树进行比较,直到找到相应的值或者进入了一棵不存在的子树为止。
其查找过程可以描述如下:
输入:
输入的第一行包含2个正整数n和k,分别表示共有n个整数和k次查询。其中n不超过500,k同样不超过500。
第二行包含n个用空格隔开的正整数,表示n个整数。
第三行包含k个用空格隔开的正整数,表示k次查询的目标。
输出:
只有1行,包含k个整数,分别表示每一次的查询结果。如果在查询中找到了对应的整数,则输出1,否则输出0。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入
8 3
1 3 5 7 8 9 10 15
9 2 5
样例输出
1 0 1
#include <iostream>
using namespace std;
typedef struct BiTNode{
int value;
struct BiTNode *lchild,*rchild;
}*BiTree;
bool LT(int a,int b){
if(a<b)
return true;
else
return false;
}
bool search(BiTree root,int data,BiTree f,BiTree&p){
if(!root){
p = f;
return false;
}
if(data == root->value){
p = root;
return true;
}
else if(data<root->value)
return search(root->lchild,data,root,p);
else if(data>root->value)
return search(root->rchild,data,root,p);
}
void insert(BiTree&root,int data){
BiTree p,s;
if(!search(root,data,NULL,p)){
s = new BiTNode;
s->value = data;
s->lchild = s->rchild = NULL;
if(!p)root = s;
else if(LT(data,p->value))
p->lchild = s;
else
p->rchild = s;
}
return ;
}
void deletetree(BiTree root){
if(root){
deletetree(root->lchild);
deletetree(root->rchild);
delete root;
}
}
int main(){
int m,n;
int num;
cin>>m>>n;
BiTree root = NULL;
BiTree p;
for(int i = 0;i<m;i++){
cin>>num;
insert(root,num);
}
for(int i = 0;i<n;i++){
cin>>num;
if(search(root,num,NULL,p))
cout<<1<<" ";
else
cout<<0<<" ";
}
return 0;
}