编程题注意
编程题中小错误
输入输出格式直接复制
迭代求近似值,最后一项小于eps的时候还要加进去
枚举素数从2开始
分解因数注意i=n/i时避免重复,还有1可能要特判
常见输入输出格式
前后不能有空格,中间有空格(或+等符号,用一个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';
}