# 2013年第四届蓝桥杯C/C++B组省赛题目解析

## 一、 高斯日记

```#include<stdio.h>
#define num 8113

int main()
{
int year = 1777,month = 4,day = 30;
int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i = 1;i < num;i++)
{
if(month == 2 && !(year % 4) && year % 100 || !(year % 400))
a[2] = 29; //是闰年
else
a[2] = 28; //否则是平年

day = (day%a[month]) + 1;  //天满进月
if(day == 1)
{
month = (month%12) + 1;  //月满进年
if(month == 1)
year++;
}
printf("%d-%d-%d\n",year,month,day);

return 0;
}
}```

## 二、马虎的算式

### 1，第一种解法，枚举每一个数字，依次累加结果。

```#include <stdio.h>
int main()
{
int a,b,c,d,e,n;
n=0;
for (a=1;a<10;a++)
for (b=1;b<10;b++)
{
if (a==b) continue;
else
for (c=1;c<10;c++)
{
if((c==a)||(c==b)) continue;
else
for (d=1;d<10;d++)
{
if((d==a) || (d==b) || (d==c)) continue ;
else
for (e=1;e<10;e++)
{
if ((e==a)||(e==b)||(e==c)||(e==d)) continue;
else if ( (10*a+b)*(100*c+10*d+e)==(100*a+10*d+b)*(10*c+e))
n++;
}
}
}
}

printf("%d\n",n);
return 0;
}```

### 2，第二种解法，使用数组和指针

```#include<stdio.h>
const int N = 9;
int num;

void f(int*p,int idx)
{
int t;
if(idx == 5)
{
if((p[0]*10 + p[1])*(p[2]*100 + p[3]*10 + p[4]) == (p[0]*100 + p[3]*10 + p[1])*(p[2]*10 + p[4]))
num++;
return;
}

for(int i = idx;i < N;i++)
{
t = p[i],p[i] = p[idx],p[idx] = t;
f(p,idx + 1);
t = p[i],p[i] = p[idx],p[idx] = t;
}
}

int main()
{
int a[N];
for(int i = 0;i < N;i++)
a[i] = i+1;
f(a,0);
printf("%d\n",num);

return 0;
}```

## 三、第39级台阶

```#include<stdio.h>

int fac(int a,int b)
{
if(a == 1)
{
if(b == 1)
return 1;
return 0;
}

if(a == 2)
return 1;
return fac(a-1,!b) + fac(a-2,!b);
}

int main()
{
printf("%d\n",fac(39,0));

return 0;
}```

## 四、黄金连分数

```#include <stdio.h>
#define F 50

int main(){

unsigned long long int fib[1000], x, y;
int f = 0, i;
int a[105];
fib[0] = 0;
fib[1] = 1;

for(i = 2; fib[i] < 1e18; i++){  // 1e18 = 1乘以10的18次方
fib[i] = fib[i-1] + fib[i-2];
f++;
}

x = fib[F-2];
y = fib[F-1];

for(i = 0; i < 101; i++){
a[i] = x / y;
x = (x % y) * 10;
printf("%d", a[i]);
}

printf("\n");
return 0;
}```

## 五、前缀判断

```char* prefix(char* haystack_start, char* needle_start)
{
char* haystack = haystack_start;
char* needle = needle_start;

while(*haystack && *needle){
if(______________________________) return NULL;  //填空位置
}

if(*needle) return NULL;

return haystack_start;
}```

```# include <stdio.h>
char* prefix(char* haystack_start, char* needle_start)
{
char* haystack = haystack_start;
char* needle = needle_start;

while(*haystack && *needle){
if(*(haystack++) != *(needle++)) return NULL;  //填空位置
}

if(*needle) return NULL;

return haystack_start;
}

int main(void)
{
char * haystack = "abcd1234";  //要判断的字符串
char * needle = "abc";  //前缀
printf("%s\n", prefix(haystack, needle));
}```

## 六、三部排序

```void sort3p(int* x, int len)
{
int p = 0;
int left = 0;
int right = len-1;

while(p<=right){
if(x[p]<0){
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if(x[p]>0){
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
else{
__________________________;  //填空位置
}
}

}```

```#include <stdio.h>
void sort3p(int* x, int len)
{
int p = 0;
int left = 0;
int right = len-1;

while(p<=right){
if(x[p]<0){
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if(x[p]>0){
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
else{
p++;  //填空位置
}
}
}

int main(void)
{
int x[] = {25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0};
int len = 14;
sort3p(x, len);
for(int i = 0; i < len; i++) {
printf("%d,", x[i]);
}
return 0;
}```

## 七、错误票据

```#include <stdio.h>
int main()
{
int a[10001]={0};  //初始化数组
long m,min=100000,max=0,i,n;
char c;
scanf("%d",&n);
for(i=0;i<n;i++)
while(1)
{
scanf("%ld",&m);
if(m>max) max=m;
if(m<min) min=m;
a[m]++;
c=getchar();
if(c!=' ') break;
}

for(i=min;i<=max;i++)
{
if(a[i]==0) printf("%ld ",i);
if(a[i]==2) m=i;
}
printf("%ld",m);

return 0;
}  ```

## 八、翻硬币

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

int turn(char a[], char b[])
{
int i;
int n = 0;
for(i = 0;a[i]!='\0';i++)
{
if(a[i] == b[i])
{
continue;
}
else
{
b[i+1]=(b[i+1]=='*' ? 'o' : '*');  //此处用到三目运算符
n++;
}
}
return n;
}

int main(void)
{
char a[1000];
char b[1000];
gets(a);
gets(b);
printf("%d\n", turn(a, b));
return 0;
}```

## 九、带分数

100 可以表示为带分数的形式：100 = 3 + 69258 / 714

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

typedef struct Interval
{
int pre;
int rear;
int satisfy;
}Interval;
Interval interval[7][5];
int count=0;

//初始化
void Init()
{
int i,j;
int value;
for(i=1;i<7;i++)
{
value=i;
for(j=1;j<5;j++)
{
interval[i][j].pre=value++;
interval[i][j].rear=value;
}
}
}

//数组初始化为0
void InitZero(int *sign)
{
int i;
sign[0]=1;
for(i=1;i<10;i++)
{
sign[i]=0;
}
}

//将一个数的各个位上拆分，并在相应的位上赋值1
int Split(int *sign,int value)
{
int index;
while(value)
{
index=value%10;
if(sign[index]==0) sign[index]=1;
else return 1;
value/=10;
}
return 0;
}

//计算一个数的位数
int CountBit(int value)
{
int n=0;
while(value)
{
n++;
value/=10;
}
return n;
}

//将一个整型数组转换成一个整数
int CreateInteger(int *data,int n)
{
int i;
int value=0;
for(i=0;i<n;i++)
{
value=value*10+data[i];
}
return value;
}

//检查是否每个数都用到
int Check(int *sign)
{
int i;
for(i=1;i<10;i++)
{
if(sign[i]==0) return 0;
}
return 1;
}

//复制
void Copy(int *sign,int *temp_sign)
{
int i;
for(i=0;i<10;i++)
{
temp_sign[i]=sign[i];
}
}

//创建一个n位数的整数
void CreateNBitNumber(int *sign,int *data,int n,int m,int value,int value3)
{
if(n==m)
{
int value1=CreateInteger(data,n);
int value2=value1*value;
int temp_sign[10];
Copy(sign,temp_sign);
if(!Split(temp_sign,value2) && Check(temp_sign))
{
count++;
}
}
else
{
int i;
for(i=1;i<10;i++)
{
if(sign[i]==0)
{
sign[i]=1;
data[m]=i;
CreateNBitNumber(sign,data,n,m+1,value,value3);
sign[i]=0;
}
}
}
}

//求出解
void Create(int value)
{
int i,j;
int sign[10];
int result;
int result_n;
int n;
for(i=3;i<value;i++)
{
InitZero(sign);
if(Split(sign,i)) continue;
result=value-i;
result_n=CountBit(result);
n=CountBit(i);
for(j=1;j<5;j++)
{
if( ((interval[result_n][j].pre+j)==(9-n)) || ((interval[result_n][j].rear+j)==(9-n)))
{
int data[5];
CreateNBitNumber(sign,data,j,0,result,i);
}
}
}
}

int main()
{
int value;
scanf("%d",&value);
Init();
Create(value);
printf("%d\n",count);
return 0;
}```

## 十、连号区间数

```#include<stdio.h>
int main()
{
int s[50005],a,i,min,max,count=0,j;
scanf("%d",&a);
for( i = 0; i < a; i++) {
scanf("%d",&s[i]);
}
for( i = 0; i < a;i++ ){
min=s[i];
max=s[i];
for( j = i; j < a; j++) {
if(min>s[j]){min =s[j];}
if(max<s[j]){max =s[j];}
if((max-min) == (j-i)){
count++;
}
}
}
printf("%d",count);

return 0;
}```

0 条评论

• ### AtCoder Beginner Contest 177 A ~ E

C 思路：数据范围比较大，O（n^n）的复杂度肯定不可以，那么我们要分析式子 假设有一组数据：

• ### BUPT2017 wintertraining(15) #2 题解

​ 因为2520%pre_lcm0，所以x%pre_lcm(x%2520)%pre_lcm

• ### 【USACO 3.2】Sweet Butter（最短路）

枚举到的某点，然后优先队列优化的dijkstra求最短路，把给定的点到其的最短路加起来，更新最小值。复杂度是

• ### pHash的Java实现

此算法中的DCT变换是从 http://blog.csdn.net/luoweifu/article/details/8214959抄过来的，因为这种需要大量的...

• ### POJ 1804 Brainman(5种解法，好题，【暴力】，【归并排序】，【线段树单点更新】，【树状数组】，【平衡树】)

Brainman Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1057...

### Zoctopus

chinamcloud图形图像视音频算法