J - 求数列的和
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
Sample Input
81 4
2 2
Sample Output
94.73
3.41
#include<stdio.h>
#include<math.h>
int main(void)
{
int n,m;
double sum,ai;
while(scanf("%d%d",&n,&m)!=EOF)
{
//初始化设置:第1项
sum=n;
ai=n;
//数列求和
while(--m)
{//更易懂的一般写法:for(i=2;?i<=m;i++)
ai=sqrt(ai);
sum+=ai;
}
//输出结果
printf("%.2f\n",sum);
}
return 0;
}
K - 水仙花数
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Sample Input
100 120
300 380
Sample Output
no
370 371
#include <stdio.h>
void main()
{
int n,m,i,temp,a,b,c,flag;
while(scanf("%d%d",&m,&n)!=EOF)
{
flag=0;
if(m>n)
{
temp=m;
m=n;
n=temp;
}
for(i=m;i<=n;i++)
{
a=i/100;
b=i%100/10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
{
flag++;
if(flag==1){
printf("%d",i);
}
else
printf(" %d",i);
}
}
if(flag==0)
printf("no");
printf("\n");
}
}
L - 多项式求和
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …
现在请你求出该多项式的前n项的和。
Input
输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。
Sample Input
2
1 2
Sample Output
1.00
0.50
#include <stdio.h>
void main()
{
int m,n,i,k;
double sum,j;
scanf("%d",&n);
while (n--)
{
scanf("%d",&m);
sum=0;
k=1;
j=1.0;
for (i=1;i<=m;i++)
{
sum=sum+j/k;
k++;
j=-j;
}
printf("%.2f\n",sum);
}
}
M - 素数判定
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)
(-39<=x<y<=50),
判定该表达式的值是否都为素数。
Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出”OK”,否则请输出“Sorry”,每组输出占一行。
Sample Input
0 1
0 0
Sample Output
OK
#include <iostream>
using namespace std;
//判定一个数是否为素数,是素数返回1,否则返回0
int check_prime_num(int arg)
{
if(arg<=0)return 0;
else if(arg==1) return 0;
else if(arg==2)return 1;
else
{
for(int j=2; j<arg; j++)
{
//取余等于0,说明除了1和本身外还有其他因数,说明他不是素数,直接返回零
if(arg%j==0) return 0;
}
return 1;
}
}
int main(void)
{
int x,y,temp,flag=0;
while(cin>>x>>y)
{
//c=0,y=0就退出
if(x==0&&y==0)break;
//判定在输入x,y之间的数后表达式结果为素数的个数
for(int i=x; i<=y; i++)
{
temp=i*i+i+41;
if(check_prime_num(temp)==1)
++flag;
}
//如果表达式结果素数的个数和输入的个数想等的话,就说明表达式结果都为素数
if(flag==(y-x+1))cout<<"OK"<<endl;
else cout<<"Sorry"<<endl;
//必须清零,供下一个循环使用
flag=0;
}
return 0;
}
N - 蟠桃记
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30)
表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
Sample Input
2
4
Sample Output
4
22
#include <iostream>
using namespace std;
int main(void)
{
int n,num=1;//最后一天蟠桃数为1,所以初始化num=1
while(cin>>n)
{
while(n>=2)
{
//用第二天的蟠桃数就可以得出第一天蟠桃数
num=(num+1)*2;
n--;
}
cout << num << endl;
num=1;
}
return 0;
}
O - 青年歌手大奖赛_评委会打分
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100)
表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
Sample Input
3 99 98 97
4 100 99 98 97
Sample Output
98.00
98.50
#include <stdio.h>
void main()
{
int n,i;
double avg,max,min,sum,t;
while (scanf("%d",&n)!=EOF)
{
sum = 0;
max = 0;
min = 0;
for (i=0;i<n;i++)
{
scanf("%lf",&t);
sum=sum+t;
if (t>max)
max=t;
else if (t<min)
min=t;
}
avg=(sum-min-max)/(n-2);
printf("%.2f\n",avg);
}
}
P - 偶数求和
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7
#include <stdio.h>
int main()
{
int n,m;
while (scanf("%d %d",&n,&m)!=EOF)
{
int i,count = 0,tmp = 0,sum = 0;
for (i=1;i<=n;i++)
{
count++;
tmp += 2; //以2开始递增的
sum += tmp;
if (i == n) //如果到了最后一个(不用管是否等于m)。
{
printf("%d\n",sum / count);
}
else if (count == m)
{
printf("%d ",sum / m); //前面按m分开的。
count = 0; sum =0;
}
}
}
return 0;
}
Q - 数据的交换输出
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
Sample Input
4 2 1 3 4
5 5 4 3 2 1
0
Sample Output
1 2 3 4
1 4 3 2 5
#include <iostream>
using namespace std;
int main()
{
int n,min,temp,j;
while (cin>>n&&n!=0)
{
int *p=new int[n];//定义指针并指向用new动态分配大小为n的空间
for (int i=0;i<n;i++)
{
cin>>p[i];
if (i==0)
{
min=p[0];
j=0;
}
else
{
if (p[i]<min)
{
min=p[i];
j=i;
}
}
}
temp=p[0];
p[0]=min;
p[j]=temp;
for ( i=0;i<n;i++)
{
if (i!=0)
{
cout<<" ";//数与数之间用空格分开
}
cout<<p[i];
}
cout<<endl;
delete p;//记着delete释放空间
}
return 0;
}
#include<iostream>
using namespace std;
const int M=100;
int n;
int m[M];
int main()
{
int i,a,a1=0,temp;
while(cin>>n&&n>0)
{
for(i=0;i<n;i++)
{ cin>>m[i];}
a=m[0];a1=0;//记录数组的下标,每次都要归零
for(i=0;i<n;i++)
{
if(m[i]<a)
{ a=m[i]; a1=i; }
}
temp=m[0];
m[0]=a;
m[a1]=temp;
for(i=0;i<n;i++)
{
if(i<n-1)
cout<<m[i]<<" ";
else
cout<<m[i]<<endl;
}
}
return 0;
}
R - 字符串统计
对于给定的一个字符串,统计其中数字字符出现的次数。
Input
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
Output
对于每个测试实例,输出该串中数值的个数,每个输出占一行。
Sample Input
2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf
Sample Output
6
9
#include<stdio.h>
#include<string.h>
int main()
{
char a[100];
int i,l,count,n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
count=0;
l=strlen(a);
for(i=0;i<l;i++)
if(a[i]<='9'&&a[i]>='0')
count++;
printf("%d\n",count);
}
return 0;
}