Skip to content

编程题注意

编程题中小错误

输入输出格式直接复制

迭代求近似值,最后一项小于eps的时候还要加进去

while(1){
        p+=x;
        if(x<eps) break;
        i++;
        x=x*i/(2*i+1);
}

枚举素数从2开始

分解因数注意i=n/i时避免重复,还有1可能要特判

for(int i=)

常见输入输出格式

前后不能有空格,中间有空格(或+等符号,用一个flag记录是否已经输出第一个数

按照输入的空格分割字符串,统计每一段长度(注意多个空格连续,和最后的输出)

while((c=getchar())!='\n'){
        if(c==' '){
            if(len)printf("%d ",len);//注意多个空格
            len=0;
        }else len++;
}
if(len!=0) printf("%d ",len);

首字母大写

while((c=getchar())!='\n'){
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
            if(flag&&(c>='a'&&c<='z')) c=c-'a'+'A';
            flag=0;
        }else if(c==' ') flag=1;
        putchar(c);
}

分数运算 7-2 N个数求和

#include<stdio.h>
struct frac
{
    int a,b;
};
typedef struct frac frac;//简化写法,不用写struct
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
frac add(frac x,frac y){
    frac z;
    int g=gcd(x.b,y.b);
    z.b=x.b/g*y.b; //求出通分后的分母
    z.a=z.b/x.b*x.a+z.b/y.b*y.a;//注意先除后乘,防止溢出!!!
    int g2=gcd(z.a,z.b);//约分
    z.a/=g2;z.b/=g2;
    return z;
}
void print(frac z){
    if(z.a>0&&z.b<0){
        z.a=-z.a;
        z.b=-z.b;
    }
    int zt=z.a/z.b;//整数部分
    if(z.a%z.b==0) printf("%d",zt);
    else if(zt==0) printf("%d/%d",z.a,z.b);
    else printf("%d %d/%d",zt,z.a-z.b*(zt),z.b);
}
int main(){
    int n;
    scanf("%d",&n);
    frac sum;sum.a=0;sum.b=1;
    for(int i=1;i<=n;i++){
        frac x;
        scanf("%d/%d",&x.a,&x.b);
        sum=add(sum,x);
    }
    print(sum);
}

char数组

由于PTA禁止使用gets,可以使用getchar()

int k=0;//注意初始化
while((a[k]=getchar())!='\n'){//注意括号
    k++;
}
//此时k的值恰好就是字符串长度
a[k]='\0';//注意要把结尾的\n改成\0

注意getchar()和其他输入如scanf混用时,要在scanf后面加上getchar读取换行符。 注意char的范围是[-128,127]. 因此ch=ch+m要小心溢出。

putchar输出值为0的字符可能会导致未知错误。尽量做判断。(比如输出一个字符数组时)

排序

选择排序

void sort(int a[],int n){
    for(int i=0;i<n;i++){//n-1也可
        int mx=0;
        for(int j=0;j<n-i;j++) if(a[j]>a[mx]) mx=j;
        int t=a[mx];a[mx]=a[n-i-1];a[n-i-1]=t;
    }
}
//另一种写法
//这个题是把最小的放在最前面,这样写下标会简单
void sort(int a[],int n){
    for(k=0;k<n-1;k++){
            index=k;
            for(i=k+1;i<n;i++) if(a[i]<a[index]) index=i;
            temp=a[index];a[index]=a[k];a[k]=temp;
    }
}

冒泡排序

for(int i=0;i<n;i++){
    for(int j=0;j<n-i-1;j++){
        if(id[j]>id[j+1]){
            int t=id[j];id[j]=id[j+1];id[j+1]=t;
        }
    }
}

进制转换

数组形式 ```c

void f(long int x,char *p){ if(x<0){ p[0]='-';p++;x=-x;//负号的处理,接下来对p+1做 } if(x==0){ p[0]='0';p[1]='\0';return; } int n=0; while(x>0){ if(x%16<10) p[n++]=x%16+'0'; else p[n++]=x%16-10+'A'; x/=16; } for(int i=0;i<n-1-i;i++){//注意最后要翻转i / n-i-1 char t=p[i];p[i]=p[n-i-1];p[n-i-1]=t; } p[n]='\0';

}

Comments