今天老师讲了几道比较基础的题目:
1、北大平台的1552 -->Doubles:
思路:找到数据中刚好为其中1倍的数字。前一个与后面的依次比对。
做法:
#include<stdio.h>
int main(){
intn,a[1000],i,j,k,count,z;
while(scanf("%d",&n)){
if(n==-1)
break;
z=1;
a[0] = n;//别忘记了我们的第一个数据
while(scanf("%d",&n)!=EOF){
a[z++] = n;
if(n==0)
break;
}
count = 0;
for(i=0;i<z;i++)
for(j=i+1;j<z;j++){
if(a[i]*2==a[j]||a[j]*2==a[i]){
count++;
}
}
printf("%d\n",count);
}
}
2、北大平台上的2739-->Sum of Consecutive Prime Numbers:
思路:1、通过打表的方式写出连续的素数。 2、连续的最大素数不超过我们输入的素数。
做法:
#include<stdio.h>
#include<string.h>
int main(){
inta,i,z,j,k,b[10005],s,count;
memset(b,0,sizeof(b));
z=0;
//先打表
for(i=2;i<10000;i++)
{
for(j=2;j<i;j++)
if(i%j==0)
break;
if(i==j)
b[z++]=i;
}
// for(i=0;i<10;i++)
// printf("%d",b[i]);
while(scanf("%d",&a)!=EOF){
if(a==0)
break;
s =0;
i=0;
j=i;
count=0;
while(1){
//开始计算
while(s<a){
s= s + b[i];
i++;
}
if(s==a){
count++;
if(b[i+1]>s)
break;
else
{
j++;
i= j;
s= 0;
}
}
else{
j++;
if(b[j]<=a)
{
i=j;
s= 0;
}
else
break;
}
}
printf("%d\n",count);
}
}
3、北大平台上的2242
思路:这题主要是要求圆的半径
方法:1、中垂线求半径 2、a/sinA = b/sinB =2R &S =1/2bcsinA
#include<stdio.h>
#include<math.h>
int main()
{
doublex1,y1,x2,y2,x3,y3,a,b,c,p,s,Sin,d;
while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
{
a =sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
b =sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
c =sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
// printf("%lf %lf %lf\n",a,b,c);
p =(a+b+c)/2.0;
// printf("%lf",p);
s =sqrt(p*(p-a)*(p-b)*(p-c));
// printf("%lf\n",s);
d =b*c*a/(2*s);
printf("%.2lf\n",d*3.141592653589793);
}
}
4、北大平台1833
思路:字典序的求法:1、记录从右到左第一次出现非递增数字的位置【num[b]<=num[b+1]】。2、向后比,找到比这个数字更大的最小数值,调换位置。3、排序
方法:
#include<stdio.h>
#include<string.h>
int main(){
int T,max,num[2000],i,j,k,n,m,p,q,temp,time,flag;
scanf("%d",&T);
while(T--){
max = 0;
scanf("%d%d",&n,&time);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
while(time--){
flag = 1;
//1、从右到左找到没有递增的数据,确定位置 p
for(i=n-2;i>=0;i--){
if(num[i]<num[i+1]){
// printf("%d %d\n",num[i],num[i+1]);
flag = 0;
p=i;
break;
}
}
if(flag==1){
for(i=0;i<n;i++)
num[i] = i+1;
// printf("ok\n");
}
else{
// printf("%d\n",p);
// printf("%d\n",num[p]);
max = num[p+1];
// printf("11111111\n");
k = p+1;
//2、找到比这个位置上的数更大的最小数
for(i=k;i<n;i++){
// printf("num[i] = %d num[p] = %d max = %d",num[i],num[p],max);
if(num[i]<max&&num[i]>num[p]){
max = num[i];
k = i;
}
// printf("11111111111111\n");
}
//3、交换
temp = num[p];
num[p] = num[k];
num[k] = temp;
//4、排序
for(i=p+1;i<n;i++){
for(j=i+1;j<n;j++){
if(num[j]<num[i]){
temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
}
}
}
for(i=0;i<n;i++)
printf("%d ",num[i]);
printf("\n");
}
}
省赛基础~嘿嘿~