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+12−Si2
#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∈(2n−1,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 232−1,减去 2 32 − 1 2^{32}-1 232−1,返回最后值。
#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