自认1009和1010写得不错,欢迎拍砖。
1001
//1001
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int tot_days;
int year, month, day;
char weekday[20];
char week[7][20] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int month_day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void cal_week()
{
int id = tot_days % 7;
strcpy(weekday, week[id]);
return ;
}
void cal_date()
{
int year_set, i;
tot_days++;
for(i = 2000; i <= 9999; i++)
{
if(i % 4 != 0 || (i % 100 == 0 && i % 400 != 0))
year_set = 365;
else
year_set = 366;
if(tot_days <= year_set)
{
year = i;
break;
}
else
tot_days -= year_set;
}
if(year % 4 != 0 || (year % 100 == 0 && year % 400 != 0))
month_day[2] = 28;
else
month_day[2] = 29;
for(i = 1; i <= 12; i++)
{
if(tot_days <= month_day[i])
{
month = i;
break;
}
else
tot_days -= month_day[i];
}
day = tot_days;
}
int main()
{
while(scanf("%d", &tot_days) && (~tot_days))
{
year = month = day = 0;
cal_week();
cal_date();
printf("%d-%02d-%02d %s\n", year, month, day, weekday);
}
return 0;
}
1002
//1002
#include <stdio.h>
#include <stdlib.h>
int main()
{
int p, e, i, d;
int a, b, c, tot;
int cas = 0;
while(~scanf("%d%d%d%d", &p, &e, &i, &d) && ((~p) || (~e) || (~i) || (~d)))
{
for(c = 0; c <= 644; c++)
{
if(((i - e) + 33 * c) % 28 != 0)
continue;
else
{
b = ((i - e) + 33 * c) / 28;
if(((e - p) + 28 * b) % 23 != 0)
continue;
else
{
tot = i + 33 * c;
if(tot > d)
break;
else
continue;
}
}
}
printf("Case %d: the next triple peak occurs in %d days.\n", ++cas, tot - d);
}
return 0;
}
1003
//1003
#include <stdio.h>
#include <stdlib.h>
int monky[310];
int main()
{
int n, m;
int i, j, t;
while(scanf("%d%d", &n, &m) && (n || m))
{
for(i = 0; i < n; i++)
{
monky[i] = i+1;
}
monky[n] = 1;
j = 0;
if(m == 1)
printf("1\n");
else
{
while(true)
{
if(monky[j] == j)
break;
for(t = 1; t < m; t++)
{
if(monky[j] == j)
break;
j = monky[j];
}
monky[j] = monky[monky[j]];
}
printf("%d\n", j);
}
}
return 0;
}
1004
//1004
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char mesa[208];
char endl[20] = "ENDOFINPUT";
char eatl[20];
int len, i;
int main()
{
freopen("1004.in", "r", stdin);
while(gets(eatl))
{
if(strcmp(eatl, endl) == 0)
break;
else
{
gets(mesa);
gets(eatl);
len = strlen(mesa);
for(i = 0; i < len; i++)
{
if(mesa[i] >= 'A' && mesa[i] <= 'Z')
mesa[i] = (mesa[i] - 'A' - 5 + 26) % 26 + 'A';
}
puts(mesa);
}
}
return 0;
}
1005
//1005
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char id[20];
char ve[] = "10X98765432";
int wi[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,};
int i, sum, mod;
int main()
{
while(~scanf("%s", id))
{
sum = 0;
for(i = 0; i < 17; i++)
{
sum += (id[i] - '0') * wi[i];
}
mod = sum % 11;
if(id[17] == ve[mod])
printf("正确\n");
else
printf("错误\n");
}
return 0;
}
1006
1007
//1007
#include <stdlib.h>
#include <stdio.h>
#define MAXN 3
typedef struct Student
{
char name[20];
long long id;
double math;
double eng;
double comp;
double aver;
}stu;
stu ss[30];
int i;
int cmp(const void *a, const void *b)
{
return (*(stu *)b).aver - (*(stu *)a).aver;
}
int main()
{
FILE *fpr, *fpw;
fpr = fopen("stu1.dat", "r");
fpw = fopen("stu2.dat", "w");
for(i = 0; i < MAXN; i++)
{
fscanf(fpr, "%s%lld%lf%lf%lf", ss[i].name, &ss[i].id, &ss[i].math, &ss[i].eng, &ss[i].comp);
ss[i].aver = (ss[i].math + ss[i].eng + ss[i].comp) / 3.0;
}
fprintf(fpw, "姓名\t 学号\t 数学 英语 计算机 平均分\n");
qsort(ss, MAXN, sizeof(ss[0]), cmp);
for(i = 0; i < MAXN; i++)
fprintf(fpw, "%s\t %lld\t %.2lf %.2lf %.2lf %.2lf\n", ss[i].name, ss[i].id, ss[i].math, ss[i].eng, ss[i].comp, ss[i].aver);
fclose(fpr);
fclose(fpw);
return 0;
}
1008
1009
//1009
//自动生成真值表
//要求:能自动生成10以下(含10个)的变量的真值表
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char order[200];
char var[10];
char tmpvar[10];
int pos[10];
int i, j, k, len, vm;
int eval_expr(void);
int eval_term(void);
int eval_num(void);
int eval_num()
{
if(order[k] == '1')
{
k++;
return 1;
}
else
{ k++;
return 0;
}
}
int eval_term()
{
int val;
if(order[k] == '(')
{
k++;
val = eval_expr();
k++;
return val;
}
if(order[k] == '!')
{
k++;
if(order[k] == '(' || order[k] == '!')
val = eval_expr();
else
val = eval_num();
if(val)
return 0;
else
return 1;
}
return eval_num();
}
int eval_expr()
{
int val, tmp;
val = eval_term();
if(k < len && order[k] == '^')
{
k++;
if(order[k] == '(' || order[k] == '!')
tmp = eval_expr();
else
tmp = eval_num();
if(val == 1 && tmp == 1)
val = 1;
else
val = 0;
}
if(k < len && order[k] == '+')
{
k++;
tmp = eval_expr();
if(val == 1 || tmp == 1)
val = 1;
else
val = 0;
}
return val;
}
void solve()
{
k = 0;
printf(" %d\n", eval_expr());
}
void print(void)
{
for(j = 0; j < vm; j++)
{
printf("%c ", tmpvar[j]);
}
printf("%s ", order);
solve();
}
void dfs(int m)
{
if(m == vm)
{
print();
return ;
}
else
{
order[pos[m]] = '0';
tmpvar[m] = '0';
dfs(m + 1);
order[pos[m]] = '1';
tmpvar[m] = '1';
dfs(m + 1);
}
}
int main()
{
while(1)
{
printf("请输入正确表达式:");
if(scanf("%s", order) == EOF)
break;
len = strlen(order);
vm = 0;
for(i = 0; i < len; i++)
{
if(order[i] >= 'a' && order[i] <= 'z')
{
pos[vm] = i;
var[vm++] = order[i];
}
}
for(i = 0; i < vm; i++)
printf("%c ", var[i]);
printf("%s 真值\n", order);
dfs(0);
printf("\n");
}
return 0;
}
1010
//1010
//仅能处理两个公式的变量个数相同,且出现顺序相同的情况
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char order[2][200];
char var[10];
char tmpvar[10];
int pos[2][10];
int i, j, k, t, len[2], vm;
int flag;
int eval_expr(int t);
int eval_term(int t);
int eval_num(int t);
int eval_num(int t)
{
if(order[t][k] == '1')
{
k++;
return 1;
}
else
{ k++;
return 0;
}
}
int eval_term(int t)
{
int val;
if(order[t][k] == '(')
{
k++;
val = eval_expr(t);
k++;
return val;
}
if(order[t][k] == '!')
{
k++;
if(order[t][k] == '(' || order[t][k] == '!')
val = eval_expr(t);
else
val = eval_num(t);
if(val)
return 0;
else
return 1;
}
return eval_num(t);
}
int eval_expr(int t)
{
int val, tmp;
val = eval_term(t);
if(k < len[t] && order[t][k] == '^')
{
k++;
if(order[t][k] == '(' || order[t][k] == '!')
tmp = eval_expr(t);
else
tmp = eval_num(t);
if(val == 1 && tmp == 1)
val = 1;
else
val = 0;
}
if(k < len[t] && order[t][k] == '+')
{
k++;
tmp = eval_expr(t);
if(val == 1 || tmp == 1)
val = 1;
else
val = 0;
}
return val;
}
int solve(int t)
{
k = 0;
return eval_expr(t);
}
void print(void)
{
int tmp[2];
for(j = 0; j < vm; j++)
{
printf("%c ", tmpvar[j]);
}
tmp[0] = solve(0);
printf("%s %d ", order[0], tmp[0]);
tmp[1] = solve(1);
printf("%s %d ", order[1], tmp[1]);
if(tmp[0] == tmp[1])
printf(" ==");
else
{
flag = 0;
printf(" !=");
}
printf("\n");
}
void dfs(int m)
{
if(m == vm)
{
print();
return ;
}
else
{
order[0][pos[0][m]] = '0';
order[1][pos[1][m]] = '0';
tmpvar[m] = '0';
dfs(m + 1);
order[0][pos[0][m]] = '1';
order[1][pos[1][m]] = '1';
tmpvar[m] = '1';
dfs(m + 1);
}
}
int main()
{
while(1)
{
printf("请输入两个正确表达式:");
flag = 1;
if(scanf("%s%s", order[0], order[1]) == EOF)
break;
len[0] = strlen(order[0]);
len[1] = strlen(order[1]);
for(t = 0; t < 2; t++)
{
vm = 0;
for(i = 0; i < len[t]; i++)
{
if(order[t][i] >= 'a' && order[t][i] <= 'z')
{
pos[t][vm] = i;
var[vm++] = order[t][i];
}
}
}
for(i = 0; i < vm; i++)
printf("%c ", var[i]);
for(t = 0; t < 2; t++)
printf("%s 真值 ", order[t]);
printf("是否相等?\n");
dfs(0);
if(flag)
printf("两个公式等值相等\n");
else
printf("两个公式等值不等\n");
printf("\n");
}
return 0;
}
1011
1012
1013
//1013
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int a[10], b[10];
int flag[10];
int sum[20];
int i, j, nm;
int cmp(const void *a, const void *b)
{
int *x = (int *)a;
int *y = (int *)b;
return (*x) - (*y);
}
void merge()
{
for(i = 0, j = 0; i < 10; i++)
sum[j++] = a[i];
for(i = 0; i < 10; i++)
sum[j++] = b[i];
qsort(sum, 20, sizeof(sum[0]), cmp);
for(i = 1, j = 0; i < 20; i++)
{
if(sum[i] != sum[j])
sum[++j] = sum[i];
}
for(i = 0; i <= j; i++)
printf("%d ", sum[i]);
printf("\n");
}
void intersect()
{
memset(flag, 0, sizeof(flag));
for(i = 0; i < 10; i++)
{
for(j = 0; j < 10; j++)
{
if(a[i] == b[j])
flag[i] = 1;
}
}
for(i = 0; i <10; i++)
{
if(flag[i])
printf("%d ", a[i]);
}
printf("\n");
}
void substract(int *x, int *y)
{
memset(flag, 0, sizeof(flag));
for(i = 0; i < 10; i++)
{
for(j = 0; j < 10; j++)
{
if(x[i] == y[j])
flag[i] = 1;
}
}
for(i = 0; i <10; i++)
{
if(flag[i] == 0)
printf("%d ", x[i]);
}
printf("\n");
}
int main()
{
freopen("1013.in", "r", stdin);
while(~scanf("%d", &a[0]))
{
for(i = 1; i < 10; i++)
scanf("%d", &a[i]);
for(i = 0; i < 10; i++)
scanf("%d", &b[i]);
printf("两集合并集为: ");
merge();
printf("两集合交集为: ");
intersect();
printf("a集合减b集合为: ");
substract(a, b);
printf("b集合减a集合为: ");
substract(b, a);
}
return 0;
}
1014
//1014
//请谨慎使用该dfs函数,完整运行时间较长;如仅是粗略查看dfs函数的性能,请激活被注释的第一行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int prime[13] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41};
int isprime[42];
int array[20];
int che;
int cnt = 0;
void dfs(int k)
{
//cnt++;if(cnt > 10000) return;
int i, j;
if(k == 20)
{
if(isprime[array[0] + array[19]])
{
for(i = 0; i < 20; i++)
printf("%d ", array[i]);
printf("\n");
}
}
else
{
for(i = 2; i <= 20; i++)
{
for(j = 1; j < k; j++)
{
if(i == array[j])
break;
}
if(j == k)
{
if(k)
{
if(isprime[array[k - 1] + i])
{
array[k] = i;
dfs(k + 1);
}
}
else
{
array[k] = i;
dfs(k + 1);
}
}
}
}
}
int main()
{
// freopen("1014.txt", "w", stdout);
int i;
memset(isprime, 0, sizeof(isprime));
for(i = 0; i < 13; i++)
isprime[prime[i]] = 1;
array[0] = 1;
dfs(1);
return 0;
}
1015
1016
//1016
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int xp[100];
int ac, ap, bc, bp;
int xpm, i;
int lena, lenb;
int max(int x, int y)
{
return (x > y ? x : y);
}
int main()
{
memset(xp, 0, sizeof(xp));
xpm = 0;
while(scanf("%d%d", &ac, &ap) && ap >= 0)
{
xpm = max(xpm, ap);
xp[ap] += ac;
}
while(scanf("%d%d", &bc, &bp) && bp >= 0)
{
xpm = max(xpm, bp);
xp[bp] += bc;
}
for(i = xpm; i >= 0; i--)
{
if(xp[i])
printf("[%d %d] ", xp[i], i);
}
printf("\n");
return 0;
}