c练习题

2013蓝桥杯的一些题目,看到就拿来做一下了。

/*  
    calculate the date through the count of day and birthday
    eg:birthday:1777/4/30 day:5343 => 1971/12/5 
*/
#include<stdio.h>

int Isleapyear(int year)
{
    return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
}

int GetMaxDay(int year, int month)
{
    switch(month){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31; 
        case 4:
        case 6:
        case 9:
        case 11: 
            return 30; 
        case 2:
            return (Isleapyear(year) ? 29:28);
        default:
            return -1; 
    }   
}

int GetXDays(int *year, int *month, int day, int X)
{
    int i;
    for(i = 0; i < X; i++) {
        if(day != GetMaxDay((int)*year, (int)*month)) {
            ++day; 
        }   
        else {
            day = 1;
            if(*month != 12) 
                ++*month;
            else {
                *month = 1;
                ++*year;
            }
        }
    }
    printf("year= %d, month = %d, day = %d\n", *year, *month, day);
    return day;
}

int main(void)
{
    int day, X;
    int year, month;
    year = 1777;
    month = 4;
    day = 30;
    X = 5343;
    day = GetXDays(&year, &month, day, X);
    printf("year= %d, month = %d, day = %d\n", year, month, day);
    return 0;
}

/*  resverse    
    1 2 3 4 5 6 7 8 9 
*/

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

int reverse(int price)
{
    int i, len, tmp, opi;
    char buf[8] = {0};
    sprintf(buf, "%d", price);
    len = (int)strlen(buf);
    if(buf[3] == 0)
        return -1; 
    for(i = 0; i < len; i++) {
        if(buf[i] == '3' || buf[i] == '4' || buf[i] == '7')
            return -1; 
        else if(buf[i] == '6')
            buf[i] = '9';
        else if(buf[i] == '9')
            buf[i] = '6';
    }   

    for(i = 0; i < len / 2; i++) {
        opi = len - 1 - i;
        tmp = buf[i];
        buf[i] = buf[opi];
        buf[opi] = tmp;
    }   
    price = atoi(buf);
    return price;
}

int find_price(void)
{
    int sub1, sub2, i, j;
    for(i = 1000; i < 9999; i++) {
        if(reverse(i) == -1) 
            continue;
        sub1 = i - reverse(i);
        if(sub1 < 200 || sub1 > 300)
            continue;
        for(j = 1000; j < 9999; j++) {
            if (reverse(j) == -1) 
                continue;
            sub2 = j - reverse(j);
            if(sub2 < 800 || sub2 > 900)
                continue;
            if((sub2 - sub1) == 558) {
                printf("i = %d , j = %d, opi = %d, opj = %d\n", i, j,reverse(i), reverse(j));
                printf("i - opi = %d, j - opj = %d opj - opi = %d\n", i - reverse(i), j - reverse(j), j - reverse(j) - i + reverse(i));

            }
        }
    }
    return 0;
}

int main(void)
{
    find_price();
    return 0;
}

/*  
    find the number such as:
    203879 * 203879 = 41566646641 
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int same(int x)
{
    int i, j, tmp;
    //char buf[32] = {0};
    char buf[32];
    sprintf(buf, "%d", x); 
    //printf("buf = %d", (int)strlen(buf));
    for(i = 0; i < 5; i++) {
        tmp = buf[i];
        for(j = i+1; j < 6; j++) {
            if(tmp == buf[j])
                return 1;
        }   
    }   
    return 0;
}

int has_same_bit(int x, long num)
{
    int i, j;
    char buf1[32], buf2[64];
    sprintf(buf1, "%d", x); 
    sprintf(buf2, "%ld", num);
    
    for(i = 0; i < 6; i++) {
        for(j = 0; j < (int)strlen(buf2); j++) {
            //printf("buf1[%d] = %c, buf2[%d] = %c\n", i, buf1[i], j, buf2[j]);
            if(buf1[i] == buf2[j]) 
              return 1;
        }   
    }   
    
    return 0;
}

int main(void)
{
    int i;
    long num;
    for(i = 100000; i < 999999; i++){
        num = (long)i*i;
        //printf("i = %ld, num = %ld\n", i, num);
        if(same(i))
            continue;
        if(has_same_bit(i, num))
            continue;
        else
            printf("the number is %d\n", i);

    }
    return 0;
}

strlen:

/*  strlen  */
#include<stdio.h>

//int mystrlen(const char a[])
int mystrlen(const char *a) 
{
    if(*a == '\0'){
        printf("this is a comment\n");
        return 0;
    }   
    else {
        printf("call myself\n");
        return 1 + mystrlen(a+1);
    }   
}

int main(void)
{
    printf("%d\n", mystrlen("test"));
    return 0;  
}

/*
    jump grid:
*/

#include<stdio.h>

#define START_ROW   0
#define START_COL   0
#define END_COL     4
#define END_ROW     3

int sum = 0;

void visit(int row, int col)
{
    if(row == END_ROW && col == END_COL)
        ++sum;
    if(row + 1 < 4)
        visit(row+1, col);
    if(col + 1 < 5)
        visit(row, col+1);
}

int main(void)
{/*
    const int array[][] = {
        {0, 1, 2, 3, 4},
        {1, 2, 3, 4, 5},
        {2, 3, 4, 5, 6},
        {3, 4, 5, 6, 7}
    };
 */
    int row, col;
    int a[4][5];
    /*  initial array   */
    for(row = 0; row < 4; row++)
      for(col = 0; col < 5; col++)
        a[row][col] = row + col;

    visit(START_ROW, START_COL);
    printf("sum = %d\n", sum);

    return 0;
}

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char ch[7];
    int a[100] = {0};
    int i = 0, c;
    int n = 0;
    int max = 0, min = 99; 
    int missing = 0, repeating = 0;
    while(n < 2 && (ch[i] = getchar()) != EOF) {
        if (ch[i] <= '9' && ch[i] >= '0')
            i++;
        else if (ch[i] == ' ') {
            i = 0;  
            c = atoi(ch);
            if(max < c)
                max = c;
            if(min > c)
                min = c;

            a[c]++;

            printf("c = %d, a[%d] = %d\n", c, c, a[c]);
        } else if(ch[i] == '\n') {
            i = 0;
            n++;
            c = atoi(ch);
            if(max < c)
                max = c;
            else if(min > c)
                min = c;

            a[c]++;

            printf("n++, c = %d, a[%d] = %d\n", c, c, a[c]);
        }   

    }   
    
    for(i = min; i < max; i++) {
        if(a[i] == 0) {
            missing = i;
        }   
        if(a[i] > 1) {
            repeating = i;
        }   
    }   

    printf("min = %d, max = %d\n", min, max);
    printf("missing = %d, repeating = %d\n", missing, repeating);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值