内大考研专业课(892)2022

2022 (892)

分离主要逻辑代码和main函数。
main函数中主要做输入输出 (直接给值)。

第一题

编写函数,给两个18位身份证号字符串,比较出生日期大小,前一个比后一个早返回-1,前一个比后一个晚返回1,相同返回0

#include <stdio.h>

// >>>答案部分
int cmp(char *a, char *b){
    for(int i = 6;i < 14;i ++){
        if(a[i] > b[i])
            return 1;
        else if(a[i] < b[i])
            return -1;
    }
    return 0;
}
// <<<结束

int main(){
    printf("%d\n",cmp("000000000009200000","000000000009200000"));
    printf("%d\n",cmp("000000001809200000","000000000009200000"));
    printf("%d\n",cmp("000000000009200000","000000001809200000"));
    printf("%d\n",cmp("000000000009200000","000000000009210000"));
    return 0;
}

0
1
-1
-1

第二题

给一个数组,利用rand函数,随机输出其下标,数字越大下标输出的概率越大。

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

int get(int a[], int n){
    srand(time(NULL));
    int sum = 0;
    for(int i = 0;i < n;i++)
        sum += a[i];
    int r = rand()%sum;
    for(int i = 0; i < n;i++)
        if((r -= a[i]) < 0)
            return i;
    return 0;
}

int main(){
    int a[5] = {1, 2, 3, 4, 5};
    printf("%d\n", get(a, 5));
    return 0;
}
3

第三题

求一个序列的平方差S。

假设

S = ∑ i ∈ 奇数 S i + 1 2 − S i 2 S = \mathop{\sum}\limits_{i \in 奇数}S^2_{i+1}-S^2_{i} S=i奇数Si+12Si2

#include <stdio.h>

int fun(int a[], int n){
    int ans = 0;
    int flag = -1;
    for(int i = 0;i < n;i++, flag = -flag)
        ans += flag * a[i]*a[i];
    return ans;
}

int main(){
    int a[5] = {1, 2, 3, 4, 5};
    printf("%d\n", fun(a, 5));
    return 0;
}
-15

第四题

给出一个序列,若中间有连续相同的数字,就输出这个数与这个数的个数的相反数,若没有连续相同的,则只输出这个数。如:输入序列为:1 3 1 3 3 6,输出序列为:1 3 1 3 -2 6

两种答案,第一种直接输出,第二种通过全局变量保存(推荐)。

#include <stdio.h>

int main(){
    int x, cnt=1;
    scanf("%d", &x);
    int prex=x;
    while(scanf("%d", &x)!=EOF){
        if(prex == x){
            cnt++;
        }
        else{
            printf("%d ", cnt == 1 ? prex : -cnt);
            cnt = 1;
            prex = x;
        }
    }
    printf("%d\n",prex);
    return 0;
}

-1496725469

由于jupyter不能输入,在jupyter没能成功运行

#include <stdio.h>
#define N 100

int ans[N];
int idx;

void fun(int a[],int n){
    idx=0;
    int cnt = 1;
    a[n] = a[n-1]+1;
    for(int i=1;i<=n;i++){
        if(a[i-1] == a[i]){
            cnt++;
        }
        else{
            ans[idx++] = cnt==1 ? a[i-1] : -cnt;
            cnt = 1;
        }
    }
    
}

int main(){
    int a[N] = {1, 3, 1, 3, 3, 6};
    int x, cnt=0;
    //while(scanf("%d", &x)!=EOF)
    //    a[cnt++] = x;
    cnt=6;
    fun(a,cnt);
    for(int i=0;i<idx;i++)
        printf("%d ",ans[i]);
    return 0;
}
1 3 1 -2 6 

第五题

给出整数p, p ∈ ( 2 n − 1 , 2 n ] p \in (2^{n-1}, 2^n ] p(2n1,2n],求返回数字n;

注:原题意为给出整数p,p在2的n和n-1次方,求返回数字n;

#include <stdio.h>

int fun(int p){
    int res = 1, cnt=0;
    while(res < p)
        res *= 2, cnt++;
    return cnt;
}

int main(){
    int p;
    //scanf("%d", &p);
    p = 1024;
    printf("%d", fun(p));
    return 0;
}
10

第六题

给出整数数列求和,如果超过 2 32 − 1 2^{32}-1 2321,减去 2 32 − 1 2^{32}-1 2321,返回最后值。

#include <stdio.h>
#define N 100
#define M 0xffffffff
#define LL long long

int sum(LL a[], int n){
    LL ans=0;
    for(int i=0;i<n;i++)
        ans = (ans + a[i]) % M;
    return ans;
}

int main(){
    LL a[N] = {0xffffffff, 4294967295, 0xffff, 1};
    printf("%d\n",sum(a, 4));
    return 0;
}
65536

第七题

以1970年1月1日零点开始,给出已经过了多少秒,秒数小于2的32次方,求现在几号。

#include <stdio.h>

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

int get_days_of_month(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 is_leap_year(year) ? 29 : 28;
    }
}

int get_day(int day){
    int year = 1970;
    int month = 1;
    while(day > (is_leap_year(year) ? 366 : 365)){
        day -= is_leap_year(year) ? 366 : 365;
        year++;
    }
    for(int i=1;i<=12;i++){
        int mday = get_days_of_month(year,i);
        if(day > mday)
            day -= mday;
        else
            return day+1;
    }
}

int main(){
    long long unix_timestamp=1664100697;//2022-09-25 18:11:37
    //scanf("%d",&unix_timestamp);
    printf("%d\n",get_day(unix_timestamp/60/60/24));
    return 0;
}
31
  • 1
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值