程序设计实践练习(执行,暴力)1

Problem A Average

题目描述
Eric希望你帮他求一下班级的平均成绩,但是为了防止个别高分和低分学生对于平均成绩的影响,需要去掉一个最高分和一个最低分的同学,然后求平均分。
输入
每个样例的第一行是一个整数N(10≤N≤50),表示班级人数,如果N为0,表示输入结束,这个样例不需要处理。 第二行是N个整数,每个整数都在[0,100]内。
输出
每行输出一个样例的结果,为一个浮点数,保留一位小数。
样例输入
10
10 20 30 40 50 60 70 80 90 100
0
样例输出
55.0

#include<stdio.h>

int main(){
    int n,i,maxx,minn,summ;
    int grade[50]={0};
    float avg;
    while(scanf("%d",&n)&&n!=0){
        maxx=0;
        minn=100;
        summ=0;
        for(i=0;i<n;i++){
            scanf("%d",&grade[i]);
            if(grade[i]>maxx)maxx=grade[i];
            if(grade[i]<minn)minn=grade[i];
            summ+=grade[i];
        }
        avg=(float)(summ-maxx-minn)/(float)(n-2);
        printf("%.1f\n",avg);        
    }
    return 0;
} 

Problem B A+B IV

题目描述
小明喜欢做a+b的算术,但是他经常忘记把末位对齐,再进行加,所以,经常会算错。 比如12+13,他把12左移了1位,结果变成了133。 小明已经算了一些等式,请计算一下他到底移动了多少位。
输入
第一行是一个整数K,表示样例的个数。 以后每行一个样例,形如a+b=c, 1≤a,b≤1e4;0≤c≤1e9。
输出
每行输出一个样例的结果,以b为标准,a如果往左移n位,输出n,如果往右移n位,输出-n。 测试数据保证一定有解,如果存在多个解,输出左移的结果。
样例输入
6
12+13=1213
12+13=1312
12+13=25
12+13=12013
12+13=133
12+13=142
样例输出
2
-2
0
3
1
-1

#include<stdio.h>

int e(int m){
    int i,s=1;
    for(i=0;i<m;i++){
        s*=10;
    }
    return s;
}

int main(){
    int k,i,j,n;
    __int64 a,b,c;
    scanf("%d",&k);
    while(k--){
        scanf("%I64d+%I64d=%I64d",&a,&b,&c);
        for(i=0;i<9;i++){
            for(j=0;j<9;j++){
                if(a*e(i)+b*e(j)==c){
                    if(i>0)n=i;
                    else n=-j;
                    break;
                }
            }
        }
        printf("%d\n",n);
    }
} 

Problem C sum & times

题目描述
整数a,b,其中a+b = c,a*b = d,已知c和d,问是否存在a和b?
输入
第一行是一个整数K,表示样例个数。 每个样例占1行,两个整数c和d,0≤c,d≤109。
输出
每行输出一个样例的结果,a和b(a≤b),之间用一个空格隔开。如果存在多组,输出a最小的那一组; 如果不存在这样的a和b,输出“None”(引号不用输出)。
样例输入
2
5 6
7 11
样例输出
2 3
None

#include<stdio.h>
#include<math.h>

int main(){
    int k;
    __int64 deta,c,d,sq_d;
    scanf("%d",&k);
    while(k--){
        scanf("%I64d %I64d",&c,&d);
        deta=c*c-4*d;
        sq_d=sqrt(deta);
        if(deta<0||sq_d*sq_d!=deta)printf("None\n");
        else if((c+deta)%2==1)printf("None\n");
        else {
            printf("%I64d %I64d\n",(c-sq_d)/2,(c+sq_d)/2);
        }
    }
    return 0;
}

易错点:类型转换
Q:浮点型数据能不能取余?

%是整型取余操作符,要求两边都是整型数才行,结果也是整型;
浮点数取余不能用操作符%
1、float c=a-(int)a/b*b;
2、float c=(int)a%b+a-(int)a;
3、用库函数fmodf、fmod或fmodl;
fmodf用于float型变量操作,
fmod用于double型变量操作,
fmodl用于long double型变量操作;

#include "stdafx.h" //If the vc++6.0, with this line.
#include "stdio.h"
#include "math.h"
int main(void){
double f=3.3,q=2.2;
printf("%f\n",fmod(f,q));
return 0;


Problem D Root

题目描述
求方程 (x+a)/(x+b) = c的非负整数根,其中a,b,c都是非负整数。
输入
第一行是一个整数K,表示样例的个数(K≤30000)。以后的K行每行为以一个样例,包含三个非负整数a,b,c (a,b,c ≤ 109)。
输出
每行输出一个样例的结果。如果方程没有根,输出“None”,否则输出根的值,如果存在多个根,输出最小的那个。
Sample Input
3
1 1 1
1 1 2
3 1 2
Sample Output
0
None
1

#include<stdio.h>

int main(){
    int k;
    __int64 a,b,c;
    scanf("%d",&k);
    while(k--){
        scanf("%I64d %I64d %I64d",&a,&b,&c);
        if(c==1&&a==b&&a==0)printf("1\n");  //容易忽略 
        else if(c==1&&a==b)printf("0\n");
        else if(c==1&&a!=b)printf("None\n");
        else if((b*c>a&&c>1)||(b*c<a&&c<1))printf("None\n");
        else if((b*c-a)%(1-c)!=0)printf("None\n");
        else if((b*c-a)/(1-c)==0&&b==0) printf("None\n");  //容易忽略 
        else printf("%I64d\n",(b*c-a)/(1-c));
    }
    return 0;
}

Problem E A+B VIII

题目描述
小明一天在做a+b时,突然他想知道a+b能被哪些数整除了?比如说2+4=6,能整除6的数有1,2,3,6,一共4个。 请你帮他算一下,a+b的和能被几个数整除。
输入
第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b,(1≤a,b≤1e9)。
输出
每行输出一个样例的结果,为一个整数。
样例输入
2
2 3
4 2
样例输出
2
4

#include<bits/stdc++.h>
#define N 50000                //注意取值范围:N<sqrt(2e9) 
using namespace std;

int primee[N]={1,1};
int prime[N];
int cnt=0;

//素数打表 
void Select(){
    for(int i=2;i<250;i++){
        if(!primee[i]){
            for(int j=i*i;j<N;j+=i)primee[j]=1;  //i*i开始 
        }
    }
    for(int i=2;i<N;i++){
        if(primee[i]==0)prime[cnt++]=i;  
    }
    //for(int i=0;i<100;i++)printf("%d ",prime[i]);

}

int main(){
    Select();
    int k;
    int a,b;
    scanf("%d",&k);
    while(k--){
        scanf("%d %d",&a,&b);
        int c=a+b;
        int temp=sqrt(c)+1;
        int res=1;
        for(int i=0;i<cnt&&prime[i]<temp;i++){
            int sum=0;
            while(c%prime[i]==0){
                c/=prime[i];
                sum++;
            }
            res*=(sum+1);
        }
        if(c>1)res*=2;
        printf("%d\n",res);
    }
}

1.求一个数的因子个数算法:
对于任意的整型N,分解质因数得到N= P1^x1 * P2^x2* …… * Pn^xn;
则N的因子个数M为 M=(x1+1) * (x2+1) * …… *(xn+1);

2.memset()函数用法
功能:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
原型:void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
例:用于清空数组,内存空间初始化.如:memset(buffer, 0, sizeof(buffer))


Problem F Score

题目描述
Alice和Bob进行了一场投篮比赛,知道他们一共投进了N个球,两者之间的比分差是M,和比赛的结果,请问比赛的比分是多少?
输入
多个样例。每个样例占一行,为非负整数N,M,(0≤N,M≤ 200),比赛结果。 如果是Alice赢,比赛结果为Alice;如果是Bob赢的话,比赛结果为Bob;平局为Draw。
输出
输出每次比赛的比分,前者为Alice,后者为Bob,中间用:隔开,如果不存在这样的比分,输出Impossible。
样例输入
4 2 Alice
4 2 Bob
4 0 Draw
2 3 Alice
样例输出
3:1
1:3
2:2
Impossible

#include<stdio.h>
#include<string.h>

int main(){
    int n,m;
    char s[10];
    while(scanf("%d %d %s",&n,&m,&s)!=EOF){                    //"!=EOF"不能省 ,否则output limit exceed 
        if(((n+m)%2!=0)||(n<m)||((strcmp(s,"Draw")==0)&&(m!=0))||((strcmp(s,"Draw")!=0)&&(m==0)))printf("Impossible\n");  //考虑所有分数错误情况 
        else if(strcmp(s,"Alice")==0)printf("%d:%d\n",(n+m)/2,(n-m)/2);
        else if(strcmp(s,"Bob")==0)printf("%d:%d\n",(n-m)/2,(n+m)/2);
        else if((strcmp(s,"Draw")==0)&&(n%2==0)&&(m==0))printf("%d:%d\n",n/2,n/2);
    }
    return 0;
}

1、字符串比较函数
设这两个字*符串为str1,str2,
若str1==str2,则返回零;
若str1< str2,则返回负数;
若str1> str2,则返回正数。

2、”!=EOF”不能省 ,否则output limit exceed


Problem G Rectangle *

题目描述
给你两个平行于坐标轴的矩形,请判断两者是不是相交(面积有重合的部分)?
输入
第一行是一个整数K,表示样例数。 每个样例占两行,每行是4个整数,表示一个矩形的对角线点的坐标,坐标值为0到1,000之间。
输出
每个样例输出一个结果,相交输出Yes,否则输出No。
样例输入
2
0 0 1 1
1 1 2 2
0 0 2 2
1 1 3 3
样例输出
No
Yes

#include<stdio.h>

#define max(a,b) (((a)>(b))?(a):(b)) 
#define min(a,b) (((a)>(b))?(b):(a))   宏定义maxmin 

int main(){
    int a[4],b[4]; 
    int k,x1,x2,y1,y2,m1,m2,n1,n2,max1,min1,max2,min2;
    scanf("%d",&k);
    while(k--){
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        scanf("%d %d %d %d",&m1,&n1,&m2,&n2);
        a[0]=min(x1,x2);
        a[1]=max(x1,x2);
        a[2]=min(m1,m2);
        a[3]=max(m1,m2);
        b[0]=min(y1,y2);
        b[1]=max(y1,y2);
        b[2]=min(n1,n2);
        b[3]=max(n1,n2);
        max1=min(a[1],a[3]);
        min1=max(a[0],a[2]);
        max2=min(b[1],b[3]);
        min2=max(b[0],b[2]);
        if(max1<=min1||max2<=min2)printf("No\n");   //先想清楚!!!! 
        else printf("Yes\n");
    }
    return 0;
} 

//二维转化为一维 

题目描述
C语言的标识符必须满足以下条件
只能由数字,英文字母,下划线组成
首字母不能是数字
不能是关键字,关键字一共32个为:
auto break case char const continue default do double else enum extern
float for goto if int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
现在给一个字符串,请判断一下是否为合法的标识符?
输入
第一行是一个整数K(K≤ 10000),表示样例的个数。 以后每行是一个不含空白符的字符串,长度不超过32个字符。
输出
每行输出一个样例的结果,如果是合法的标识符,输出“Yes”,否则输出“No”。(引号不要输出)
样例输入
5
1a
a
a1
_
if
样例输出
No
Yes
Yes
Yes
No

#include<stdio.h>
#include<string.h>

char key[32][10]={"auto","break","case","char","const","continue","default",
    "do","double","else","enum","extern","float","for","goto","if","int","long",
    "register","return","short","signed","sizeof","static","struct","switch",
    "typedef","union","unsigned","void","volatile","while"};


int main(){
    int k,i;
    char s[33];
    scanf("%d",&k);
    while(k--){
        scanf("%s",s);
        bool flag=true;  //适当时候可使用bool型 
        for(i=0;i<32;i++){
            if(strcmp(s,key[i])==0){
                flag=false;
                break;    //注意break和continue的区别 
            } 
        } 
        if(flag==true){
            for(i=0;i<strlen(s);i++){
                if((s[i]>='0'&&s[i]<='9')||(s[i]>='A'&&s[i]<='Z')||(s[i]>='a'&&s[i]<='z')||s[i]=='_')flag=true;
                else {
                    flag=false;
                    break;   //注意break和continue的区别
                }
            }
        }
        if(flag==true){
            if(s[0]>='0'&&s[0]<='9')flag=false; 
        }
        flag?puts("Yes"):puts("No");
    }
    return 0;
} 

break与continue的的用法以及区别
*break对if-else不起作用,一般用于结束循环
1.当它们用在循环语句的循环体时,break用于立即退出本层循环,
而continue仅仅结束本次循环(本次循环体内不执行continue语句后的其它语句,但下一次循环还会继续执行。
2. 如果有多层循环时,break只会跳出本层循环,不会跳出其他层的循环
3. break可用于switch语句,表示跳出整个switch语句块,而continue则不能单独的用于switch语句。
但是continue可以用于循环内部的switch语句。
4. break和continue语句在循环内的switch语句中使用时,是有区别的。
在这种情况下的break是指跳出switch语句块(switch语句块的代码仍然执行)。
而这种情况下的continue是指结束本次循环(不在执行switch后面的代码),进行下一次循环.


Problem I Matrix Transposition *

题目描述
矩阵转置就是把原矩阵A的所有元素aij转成矩阵B的bji。 现实中,大部分的矩阵都是稀疏的,所以,存储矩阵时,我们可以只存储存储每个非零元素的坐标和值,并且按行优先排序。 比如说3×3矩阵
0 1 0
0 2 3
0 0 0
其转置矩阵为
0 0 0
1 2 0
0 3 0
上面矩阵使用稀疏矩阵的存储方法存(i,j,aij)为
0 1 1
1 1 2
1 2 3
其转置矩阵
1 0 1
1 1 2
2 1 3
输入
第一行是一个整数T,(0< T≤10),表示样例的数目。
每个样例的第一行是三个整数N,M,K,1≤N,M≤1000,1≤K≤10000,分别表示矩阵的行数,列数,非零元素个数。
以后的K行,每行三个整数X,Y,V,0≤X< N,0≤Y< M,−100≤V≤100,表示元素的行,列,值。
数据保证输入元素的顺序按行优先有序。
输出
输出每个样例的结果,每个样例输出之后有一个空行。
样例输入
2
3 3 3
0 1 1
1 1 2
1 2 3
1 3 1
0 0 1
样例输出
1 0 1
1 1 2
2 1 3

0 0 1

#include<bits/stdc++.h>

using namespace std;

struct mat{
    int x,y,v;
}a[10000];

bool cmp(mat c,mat d){  
    if(c.y==d.y)return c.x<d.x;
    else return c.y<d.y;
}

int main(){
    int i,t,n,m,k;
    cin>>t;
    while(t--){
        cin>>n>>m>>k;
        for(i=0;i<k;i++)cin>>a[i].x>>a[i].y>>a[i].v;
        sort(a,a+k,cmp);
        for(i=0;i<k;i++)cout<<a[i].y<<' '<<a[i].x<<' '<<a[i].v<<endl;
        cout<<endl;
    }
    return 0;
} 

1.c++中sort()及qsort()的用法总结
http://blog.csdn.net/ajioy/article/details/6976945
2.结构体struct的使用

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值