OJ自记

开始准备OJ了终于,太菜了,所以想记的就记到这里,Updating~

1、 要善于利用long long类型

2、 12345这种各个位上的数字都要利用的话可以朴素一点用数组存起来再用,%10/=10

3、 像有的既要存又要存字符串可以利用结构体struct

4、 奇偶校验,输入字符,转换为ASCII码,再转换为二进制,数数几个1,偶数则为偶,第一位为0,反之为奇第一位为1,加判断转为二进制若是不够7位前面补0,最后注意是倒序输出

int s = (int)a[i];  //转换为ASCII码

for(k=0;k<num;k++)
    sum += b[k];  //看看有几个1
if(sum % 2 == 0)  //偶数就是偶数输出第一位为1
    printf("1");

5、 还是,像输入一串字符串,然后按照ASCII码由小到大的顺序输出,只需添加头文件string.h(为获取字符串长度strlen())然后直接冒泡排序,输出结果即可

6、
C语言的中gets(s)scanf("%s",s) 的区别
二者都是从终端读入字符串。功能为
1、 gets功能为读入一行,并将换行符转换为字符串结束符。
2、 scanf("%s",s);读入时,遇到空白字符,包括空格,制表符,换行符时均会停止输入
从功能上可以看出不同之处:
1 终止条件不同。gets只有遇到 \n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入。
比如输入"test string\n"。
用gets得到的字符串为"test string",(即可以输入空格)
而用scanf得到的是"test"。(即不可输入空格)

注意:这是c语言的库,要用得在c下然后加string.h

7、
两个数找最大公约数:

while(scanf("%d %d",&m,&n)!=EOF){
        int temp = n; //若是后者本身就是前者的约数,则就是后者本身
        while(m % n !=0){
            temp = m%n;
            m = n;
            n = temp;
        }
        printf("%d\n",temp);
    }

(为什么第一步是temp=n呢,本来是要开始保证m小n大,这样就不用了,可以保证m大n小而且n为m约数时输出正确结果)
补充一个函数求,是递归

int gcd(int a, int b)//欧几里得算法求最大公约数
{
    if(b==0) return a;
    else return gcd(b, a%b);
}

8、 算一个数的次方的话是 pow(x,y) 表示x的y次方(math.h)

9、 输出一个字符串数组的逆序这样是可行的
就是注意i的边界,是实打实的0到m-1

while(scanf("%s",&a)!=EOF){
        int m = strlen(a);
        for(int i=m-1;i>=0;i--)
            printf("%c",a[i]);
}

10、 一个求反码的题,这里所谓的反码是指:
若是小写字母,则a——z,c——x,这样。大写字母就是A——Z这样,其他如数字啊字符啥的不变。
这里转换的代码为:

if('a'<=a[i] && a[i]<='z')
	a[i] = 'z' - a[i] + 'a';
else if('A'<=a[i] && a[i]<='Z')
    a[i] = 'Z' - a[i] + 'A';

11、 减去’0’ 作用,就是得到数字,因为定义用的是char类型嘛,举个例子就是
’3’-‘0’ 样的话就得到了3这个数字本身这样

char n[1000];
    while(gets(n)){
        sum += (n[i] - '0');
    }

减去’a’ 则是在于得到数字,举个例子,如下则得到的结果为1

int main(){
    char n='b';
    int c = n-'a';
    printf("%d",c);
    return 0;
}

12、 今年的第几天问题,涉及到闰年
怎么判断的呢,year%400==0或者year%4==0 && year%100!=0
直接加上每个月的天数,在最后判断是否为闰年并且所写月份是否在二月后,是否加1即可

int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
    while(scanf("%d%d%d",&y,&m,&d)!=EOF){
        for(int i=1;i<m;i++){
            d += month[i];
        }
        if(y%400 == 0 || (y%4==0 && y%100!=0))
            if(m>2)
                d += 1;
        printf("%d\n",d);
    }
    return 0;
}

13、 c语言里定义结构体是这样的

typedef struct name{
    char xxx[10];
    int xxx;
    ...
}name;

要是根据输入的n开大小的话是这样

name na[n];

14、 atoi这个函数是把一个字符转换为数字(此条与上一条同为题目:查找学生信息)
本条的意义在于,前面定义结构体有一个学号,如果是按照int类型定义的话,输入时会有01,02这样的数据,输出时前面的0就会被吞掉,所以用char类型定义,这样在比较的时候就得用到atoi这个函数把这个char转化为数字,以此来判断。

15、 字符串问题:替换,就是这样,如果是a-y则替换为后一位即b-z,如果是z则替换为a,大写则一样用大写字母替换,就是gets(a),然后a[i]++ 即可实现效果,字符串操作,熟

char a[90];
    while(gets(a)){
        for(int i=0;i<strlen(a);i++){
            if('a'<=a[i] && a[i]<='y')
                a[i]++;
            else if(a[i] == 'Z')
                a[i] = 'A';
        }

16、 最简真分数分子<分母,且最大公约数(求法看第七条)为1(不可化简呗)

17、 求二叉树的公共父节点(最初的) 就如下这样

while(a!=b){
            if(a>b)
                a = a/2;
            else
                b = b/2;
        }
        printf("%d\n",a);

18、二叉树两个节点之间有几个节点这样
OJ自记_第1张图片
好比输入3和12,那么就是3、6、7、12一共四个数,就是子节点父节点二倍二倍+1递归算一下即可

void get(int m,int n){
    if(m<=n)
        result++;
    else
        return;
    get(2*m,n);
    get(2*m+1,n);
}

19、 一个数求反转,即12变成21这样

int reverse(int num){
    int sum=0;
    while(num){
        sum= sum*10+num%10;
        num/=10;
    }
    return sum;
}

20、 求素数
就是直接只判断2-根号下这个数即可

bool isprime(int n){
    if(n<=1)
        return false;              /小于等于1,直接返回false
    int sqr = (int)sqrt(1.0*n);    /因为sqrt要求里面是浮点数运算,所以是乘以了1.0
    for(int i=2;i<=sqr;i++){       /2到根号n看是否有能整除的,有的话就不是素数
        if(n%i==0)
            return false;
    }
    return true;
}
int prime[101],pnum=0;             /prime存素数,pnum存素数的个数
bool p[101] = {0};                 /true表示是素数
void find_prime(){                 /这个例子是求了100以内的素数
    for(int i=1;i<101;i++){
        if(isprime(i) == true){
            prime[pnum++] = i;
            p[i]=true;
        }
    }
}

你可能感兴趣的:(笔记)