一、素数个数
给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数。
输入
第一行是一个整数K(1<=K<=1000),表示有多少个样例,每个样例占一行,是两个整数a和b,每个整数之间用一个空格隔开。
输出
每行输出一个样例的结果。
`#include
#include
const int N=1000000;
int prime[1000000];
int main()
{
int i,j;
for(i=2; i
else prime[i]=0;
}
prime[2]=1;
for(i=9; i
for(y=2; y<=sqrt(i); y++){
if(i%y == 0){
prime[i] = 0;
break;
}
}
}
int k;
scanf("%d",&k);
while(k–){
int a,b,count;
count = 0;
scanf("%d%d",&a,&b);
int x,c;
if(a>b){
c = a;
a = b;
b = c;
}
x = a;
for(; x<=b; x++){
if(prime[x]) count++;
}
printf("%d\n",count);
}
return 0;
}`
二、平方数
描述
给你一个整数集合A(无重复元素),如果x,y都属于A,且y=xx,那么组成一个数对,请找出这个集合中满足条件的数对的个数。比如说集合A={2,3,4},则只有4=22,则答案为1。
输入
每个样例占2行,第一行为一个非负整数n,n<=1000,为集合中元素的个数,如果n为0则输入结束。第二行为n个整数,为集合的元素,所有的元素为非负整数,且<=100,000,000,两个整数之间有一个空格隔开。
输出
每行输出一个样例的结果。
#include
int main()
{
int n;
while(scanf("%d",&n) == 1){
if(n <= 0)
return 0;
int count=0, x, m, y;
long long int a[1001], b[1001];
for(x=0; x < n; x++){
scanf("%lld",&a[x]);
b[x] = a[x] * a[x];
}
for(y=0; y < n; y++){
for(m=0; m < n; m++){
if(a[y] == b[m])
count++;
}
}
printf("%d\n",count);
}
}
三、排序
#include
N个整数,将其排序输出。
输
第一行是一个整数K(1<=K<=20),表示有多少个样例,每个样例的第一行是一个整数N(1<=N<=1,000)和一个字符X,X为A时表示升序排序,为D时为降序排列;第二行为N个整数,每个整数都可以使用int表示,每个之间用一个空格隔开。
输出
每个样例输出一行,按排序要求输出整数,每个整数之间输出一个空格。(最后一个整数后不要有空格)
int main()
{
int a[1001];
int m;
int n;
char x;
scanf("%d",&m);
while(m–){
scanf("%d %c",&n,&x);
int i;
for(i=0;i
}
int b, c;
for(i=0; i
c = a[i];
a[i] = a[b];
a[b] = c;
}
}
}
if(x == ‘A’){
for(i=0; i
}
printf(”%d\n",a[n-1]);
}
else{
for(i=n-1; i>0; i–){
printf("%d “,a[i]);
}
printf(”%d\n",a[0]);
}
}
return 0;
}
四、组合数
#include
2n=C(n,0)+C(n,1)+…+C(n,n)。其中表示幂,C(n,x)表示组合数,即C(n,x)=n!/((n-x)!x!)。现在给你n(0<=n<=33),要你输出2^n的组合数之和的表达式
输入
每行一个整数n,如果n为负数则输入结束。
输出
每行输出一个表达式,表达式格式形似为2^n=C(n,0)+C(n,1)+…+C(n,n)。
Sample Input
2
3
-1
Sample Output
2^2=1+2+1
2^3=1+3+3+1
int main()
{
__int64 a[34][34];
int i, j;
for(i=0; i<=33; i++){
a[i][0] = 1;
a[i][1] = i;
a[i][i] = 1;
}
for(i=3; i<=33; i++){
for(j=2; j<33; j++){
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
int n;
while(scanf("%d",&n) == 1){
if(n<0) return 0;
printf(“2^%d=1”,n);
if(n>0){
for(i=1; i<=n; i++){
printf("+%d",a[n][i]);
}
}
printf("\n");
}
}
五、日期
给出一个日期,请计算这天是这一年的第几天? 输入 第一行是一个整数N,表示样例的个数,以后每行一个日期,日期格式满足“YYYY-MM-DD”的格式(即年4位,月2位,日期2位)。 输出 每行输出一个整数,即第几天,输入保证日期的合法性。
Sample Input
3
2000-02-29
2001-02-01
2001-02-28
Sample Output
60
32
59
#include
int main()
{
int n;
scanf("%d",&n);
while(n–){
int a, b, c;
int i, count=0;
scanf("%d-%d-%d",&a,&b,&c);
if(a%400 ==0 || (a%4 == 0 && a%100 !=0)){
int sh[] = {31,29,31,30,31,30,31,31,30,31,30,31};
for(i=0; i
}
printf("%d\n",count+c);
}
else{
int sh[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0; i
}
printf("%d\n",count+c);
}
}
return 0;
}
六、三角形
题目描述
给一个序列,按下面的方式进行三角形累加,求其和值。 比如序列为 1,2,3,4,5
1 2 3 4 5
3 5 7 9
8 12 16
20 28
48
输入
有多组样例。每个样例的第一行是一个整数N(1≤N≤100),表示序列的大小, 如果N为0表示输入结束。这个样例不需要处理。 第二行是N个整数,每个整数处于[0,100]之间。
输出
每行输出一个样例的结果,由于结果可能很大,请将结果对2013取模。
样例输入
5
1 2 3 4 5
2
1 1
0
样例输出
48
2
#include
int main()
{
int n;
long long int a[100][100];
while(scanf("%d",&n) == 1){
if(n==0) return 0;
int i;
for(i=0; i
}
int j;
for(i=1; i
}
}
printf("%d\n",a[n-1][0]);
}
}
七、湘潭大学
题目描述
湘潭大学简称“XTU”,作为即将成为湘大的一份子,怎么不能为湘大添砖加瓦了?现在给你一个字符串,请你计算一下,从中选取字符,最多能组成多少个“XTU”?
输入
第一行是一个整数K,表示样例的个数。 以后每行一个字符串,字符串只包含英文大写字母,长度不会超过1000。
输出
每行输出一个样例的结果。
#include
#include
int main()
{
int n;
scanf("%d",&n);
while(n–){
char xtu[1009];
int i, x=0, t=0, u=0;
scanf("%s",&xtu);
for(i=0; i
if(xtu[i]‘T’) t++;
if(xtu[i]==‘U’) u++;
}
int min;
if(x>=t) min=t;
else min = x;
if(min>=u) min=u;
printf("%d\n",min);
}
return 0;
}
八、整数分类
按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。比如说24,2+4=6,则24的类别数是6;39,3+9=12,1+2=3,则39的类别数是3。
输入
每行输入一个非负整数n,n≤10500,n为0时结束。
输出
每行输出对应整数的分类数。
#include
#include
int main()
{
char n[999];
while(scanf("%s",&n)){
int i, sum = 0, j;
if(n[0] == ‘0’) return 0;
for(i=0; i
}
while(sum>9){
i = sum;
sum = 0;
while(i){
sum += i % 10;
i /= 10;
}
}
printf("%d\n",sum);
}
}