Advertisement

蓝桥杯练习

阅读量:

文章目录

    • 基础章节练习
    • 回环数字及其相关特性
    • 判断逻辑与数字特性
    • C(n,k)性质分析及二维数组实现
    • 序列分析及其极值计算与累加处理
    • 字符串处理与图形绘制结合
    • 循环处理二进制序列

算法课程

大小写字母转换

  • 算法优化

    • 递归实现(递归)
    • 数组求和运算(数组)
    • 字符比较操作(字符函数、strcmp)
    • 循环分解问题(Monday-Saturday质因子)
    • 编写字符串比较函数(指针操作)
    • 成绩排序问题(结构体) (40分)
    • 成绩排序2 (结构体) (未解)
    • 利用指针进行逆序输出 (指针操作)
  • 历届试题汇编

  • Excel地址计算问题

  • 斐波那契数列相关研究

  • 核桃数量分析

  • 硬币翻转问题研究

  • 巧克力分割方案探讨

  • 公式求值与简化技巧

  • 带分数运算技巧解析

基础练习

特殊回文数(回文数、循环、条件语句)

问题描述
123321是一个非常特殊的数值特征,在正反两个方向上具有相同的数值特征。
对于任意给定的正整数n,编写程序以找出所有满足条件的五位回文数字和其他六位回文数字,并确保这些回文数字的所有位置上的数字之和必须等于输入值n


输入格式
输入一行,包含一个正整数n。


输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。


样例输入
52


样例输出
899998
989989
998899


数据规模和约定
1<=n<=54。


复制代码
    #include<stdio.h>
    int main(){
    	int num[1000];
    	int a, b, c, n, i, j;
    	i = 0;
    	scanf("%d", &n);
    	for( a=1; a<10; a++){
    		for( b=0; b<10; b++){
    			for( c=0; c<10; c++){
    				if( 2*a + 2*b + c == n){
    					num[i] = a*10000 + b*1000 + c*100 + b*10 + a;
    					i++;
    				}
    			}
    		}
    	}
    	for( a=1; a<10; a++){
    		for( b=0; b<10; b++){
    			for( c=0; c<10; c++){
    				if( 2*a + 2*b + 2*c == n){
    					num[i] = a*100000 + b*10000 + c*1000 + c*100 + b*10 + a;
    					i++;
    				}
    			}
    		}
    	}
    	for( j=0; j<i; j++){
    		printf("%d", num[j]);
    		if( j!=i){
    			printf("\n");
    		}
    	}
    	return 0;
    }

回文数(循环、判断、回文数)

问题陈述 一个独特的四位十进制数字如1221具有回文性质,即其正反顺序相同.我们的目标是找出并列举出所有满足这一条件的四位十进制数值.

问题陈述 一个独特的四位十进制数字如1221具有回文性质,即其正反顺序相同.我们的目标是找出并列举出所有满足这一条件的四位十进制数值.


输出格式
按从小到大的顺序输出满足条件的四位十进制数。


复制代码
    #include<stdio.h>
    int main(){
    	int hw[1000];
    	int i, j, a, b, c, d;
    	for( a=1; a<10; a++){
    		for( b=0; b<10; b++){
    			for( c=0; c<10; c++){
    				for( d=1; d<10; d++){
    					if( a==d && b==c){
    						printf("%d\n",a*1000 + b*100 + c*10 + d);
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }

杨辉三角形(二维数组)

具体阐述杨辉三角形的相关内容。它可以被简称为Pascal三角形,在数学领域具有重要的研究价值。在(a+b)^(i)展开式中,其第i+1项的系数对应于杨辉三角形中的数值排列。此外,在这一著名数阵中存在显著特征:每一层的每个数字都等于其相邻上一层两侧数字之和。

下面给出了杨辉三角形的前4行:

1
1 1
1 2 1
1 3 3 1

给出n,输出它的前n行。


输入格式
输入包含一个数n。


请生成杨辉三角形的前N项,并从每行的第一个元素开始依次输出各元素,各元素之间用一个空格分隔。无需在开头添加额外的空白字符。


样例输入
4


样例输出
1
1 1
1 2 1
1 3 3 1


数据规模与约定
1 <= n <= 34。


复制代码
    #include<stdio.h>
    int main(){
    	int i, j, n;
    	int a[34][34];
    	scanf("%d", &n);
    	a[0][0] = 1;
    	for( i=1; i<n; i++){
    		for( j=0; j<=i; j++){
    			if( j==0 || j==i){
    				a[i][j] = 1;
    			}
    			else{
    				a[i][j] = a[i-1][j-1] + a[i-1][j];
    			} 
    		}
    	}
    	for( i=0; i<n; i++){
    		for( j=0; j<=i; j++){
    			printf("%d ",a[i][j]);
    		}
    		printf("\n");
    	}
    	return 0;
    }

数列特征(循环、最大值、最小值、累加)

问题描述
给出n个数,找出这n个数的最大值,最小值,和。


输入格式
第一行为整数值n。
第二行包含n个数值。
这些数字即为给定的全部数字。
每个数字的绝对值均不超过9999。


请按照以下格式进行操作:
首先输出结果分为三部分。每一部分包含一个整数值。第一部分记录这些数值中的最大值。第二部分记录这些数值中的最小值。第三部分记录这些数值的总和。


样例输入
5
1 3 -2 4 5


样例输出
5
-2
11


数据规模与约定
1 <= n <= 10000。


复制代码
    #include<stdio.h>
    int main(){
    	int n, i, j, t;
    	int sum=0;
    	int a[10000];
    	scanf("%d",&n);
    	for( i=0; i<n; i++ ){
    		scanf("%d", &a[i]);
    	}
    	for( i=0; i<n; i++ ){
    		sum += a[i];
    	}
    
    	//冒泡排序
    	for( i=0; i<n-1; i++ ){
    		for( j=0; j<n-i-1; j++ ){
    			if( a[j]>a[j+1] ){
    				t = a[j];
    				a[j] = a[j+1];
    				a[j+1] = t;
    			}
    		}
    	}
    	printf("%d\n", a[n-1]);
    	printf("%d\n", a[0]);
    	printf("%d", sum);
    
    	return 0;
    }

字母图形(循环、字符串)

问题描述部分


请接收一行数据,并读取其中两个整数值n和m。这两个整数值分别代表你要输出图形的行号与列号。


输出格式
输出n行,每个m个字符,为你的图形。


样例输入
5 7


样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC


数据规模与约定
1 <= n, m <= 26。


复制代码
    #include<stdio.h>
    int main(){
    	int n, m;
    	int i, j, k;
    	char a[26];
    	a[0] = 'A';
    	for( i=1; i<26; i++ ){
    		a[i] = a[i-1]+1;
    	}
    	scanf("%d %d", &n, &m);
    	for( i=0; i<n; i++ ){
    		for( j=i,k=1; j>=0 && k<=m; j--,k++){  //加上一个变量k作为限制输出个数的条件
    			printf("%c", a[j]);
    		}
    		for( j=1; j<m-i; j++ ){
    			printf("%c", a[j]);
    		}
    		printf("\n");
    	}
    	return 0;
    }

01字串(循环)

问题描述
对于长度为5位的一个二进制字符串(由0和1组成),总共有2^5=32种不同的组合。这些序列中的前几个依次是:
00000
00001
00010
接下来是:
请按照从小到大的顺序列出这32种二进制字符串的所有可能组合。


输入格式
本试题没有输入。


输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。


样例输出
00000
00001
00010
00011
<以下部分省略>


方法一:

复制代码
    #include<stdio.h>
    int main(){
    	int i, j, k, m, n;
    	for( i=0; i<2; i++){
    		for( j=0; j<2; j++ ){
    			for( k=0; k<2; k++ ){
    				for( m=0; m<2; m++ ){
    					for( n=0; n<2; n++ ){
    						printf("%d%d%d%d%d\n", i,j,k,m,n);
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }

方法二:可以直接打印输出32行。

算法训练

大小写转换(数组操作、字符串输入)

问题描述
设计一个程序来实现对输入字符串的大小写转换功能:该程序接收一个长度不超过20个字符的输入字符串,并对其中的每个字符执行大小写字母反转操作(即将所有大写字母转换为小写字母、所有小写字母转换为大写字母),最后输出处理后的结果。


指定方式下,请您指定一个由英文字母组成的字符串,并确保该字符串不含非字母字符以及任何空格。


输出格式
输出经过转换后的字符串。


样例输入
AeDb


样例输出
aEdB


锦囊:
怎么输入一个字符串以回车键结束?
gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加’\0’字符。其调用格式为:gets(s);其中s为字符串变量(字符串数组名或字符串指针)。
gets(s)函数与scanf(“%s”,s)相似,但不完全相同,使用scanf(“%s”,s)函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

复制代码
    #include<stdio.h>
    int main(){
    	int i;
    	char str[100];
    	gets(str);
    	for( i=0; str[i]!='\0'; i++){   //不能用双引号"\0"
    		if( str[i]>=65 && str[i]<=90 ){
    			str[i] = str[i]+32;
    		}
    		else if( str[i]>=97 && str[i]<=122 ){
    			str[i] = str[i]-32;
    		}
    	}
    	puts(str);
    	return 0;
    }

加法运算(指针)

为帮助你的表妹更好地掌握整数加法运算,请编写一个辅助学习程序。该程序通过调用自定义函数GetTwoInts来获取两个待相加的整数值。接着计算这两个整数值的和,并将结果展示出来。具体要求如下:主函数中禁止直接使用 scanf 等方式输入这两个整数;然而 GetTwoInts 函数内部仍可使用 scanf 来完成数据获取。此外,请注意 GetTwoInts 函数需同时返回两个整数值;由于无法通过常规返回值实现这一点,在实现时必须采用指针类型。


输入格式:输入只有一行,即两个100以内的整数。


输出格式:输出只有一行,即这两个整数之和。


样例输入
4 7


样例输出
11


复制代码
    #include<stdio.h>
    
    void GetTwoInts( int *a, int *b, int *sum);
    
    int main(){
    	int a, b;
    	int sum;
    	GetTwoInts(&a, &b, &sum);  //运算符 & 的作用是获得变量的地址
    	printf("%d", sum);
    	return 0;
    }
    
    void GetTwoInts( int *a, int *b, int *sum){  //指针作为函数参数
    	scanf("%d %d", a, b);
    	*sum = *a + *b;  //都有*
    }

补充:指针实现交换函数

复制代码
    #include<stdio.h>
    
    void swap(int *a, int *b);
    
    int main(){
    	int a, b;
    	scanf("%d %d", &a, &b);
    	swap(&a, &b);
    	printf("%d %d", a, b);
    	return 0;
    }
    
    void swap(int *a, int *b){
    	int t;  //不是 int *c
    	t = *a; 
    	*a = *b;
    	*b = t;
    }

1的个数

资源限制
时间限制:1.0s 内存限制:256.0MB


任务说明

任务说明

任务说明

任务说明


输入格式
一个正整数n


输出格式
一个整数,表示1出现的资料


样例输入
15


样例输出
8


数据规模和约定
n不超过30000


复制代码
    #include<stdio.h>
    int main(){
    	int i, n, k;
    	int count=0;
    	int a[30000] = {1};  //只给a[0]赋值,后面的元素会自动赋0值
    	scanf("%d", &n);
    	for( i=1; i<=n; i++ ){
    		a[i] = a[i-1]+1;
    		}
    
    	for( i=n-1; i>=0; i-- ){
    		if( a[i]>=10000 && a[i]<=30000 ){
    			k = a[i]/10000;
    			a[i] %= 10000;
    			if( k==1 ){
    				count++;
    			}
    		}
    		if( a[i]>=1000 && a[i]<10000 ){
    			k = a[i]/1000;
    			a[i] %= 1000;
    			if( k==1 ){
    				count++;
    			}
    		}
    		if( a[i]>=100 && a[i]<1000 ){
    			k = a[i]/100;
    			a[i] %= 100;
    			if( k==1 ){
    				count++;
    			}
    		}
    		if( a[i]>=10 && a[i]<100 ){
    			k = a[i]/10;
    			a[i] %= 10;
    			if( k==1 ){
    				count++;
    			}
    		}
    		if( a[i]==1 ){
    			count++;
    		}
    	}
    	printf("%d", count);
    	return 0;
    }

大等于n的最小完全平方数

问题描述请描述一下需要解决的具体问题。特别提示特别提示特别提示特别提示特别提示特别提示特别提示特别提示特别提示


输入格式
一个整数n


输出格式
大等于n的最小的完全平方数


样例输入
71711


样例输出
71824


数据规模和约定
n是32位有符号整数。


注意点:

  1. 本题应使用long long类型实现;
  2. 对于可能的负数或零的情况须特别注意处理;
  3. 平方根函数定义如下:double sqrt(double x);
  4. 当题目中的数据范围较大时:
    建议优先选择使用long long类型以避免溢出风险,
    并确保输入输出的数据格式正确。
类型 输入 输出
int &d %d
long &ld %ld
long long &lld %lld
double &lf %lf 或 %f

蓝桥系统无法执行将m = long (sqrt(n))进行强制转换的功能;改用m = sqrt(n)可以使系统自动完成这一转换过程。


复制代码
    #include<stdio.h>
    #include<math.h>
    int main(){
    	long long n, m;
    	scanf("%lld", &n);
    	if( n<=0 ){
    		printf("0");
    	}
    	else{
    		m = sqrt(n);
    		if( m*m == n ){
    			printf("%lld", n);
    		}
    		else{
    			printf("%lld", (m+1)*(m+1));
    		}
    	}
    	return 0;
    }

Bit Compressor (DP,即动态规划)(未解)

P0505(阶乘问题)

整数n的阶乘表示为n! 即为从1至n所有整数的连乘积 其增长速度极快 到了13!时已经相当大了 而到了35!时则更是如此 同样无法放入普通整型变量中 本题要求我们关注的是n!展开后最右端的那个非零数字是多少


输入:7


输出:4


复制代码
    #include<stdio.h>
    int main(){
    	int n;
    	int i, k;
    	long jc=1;
    	scanf("%d", &n);
    	for( i=1; i<=n; i++ ){
    		jc *= i;
    		if( jc%10 != 0 ){
    			jc %= 1000;   //只取 num 的后三位,因为n<=100,只留后三位即可
    		}
    		while( jc%10 == 0 ){   //不要用if
    			jc /= 10;
    		}
    	}
    	k = jc%10;
    	printf("%d", k);
    	return 0;
    }

图形显示(循环语句)

问题描述
编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数):





复制代码
    #include<stdio.h>
    int main(){
    	int n;
    	int i, j;
    	scanf("%d", &n);
    	for( i=0; i<n; i++ ){
    		for( j=n-i; j>0; j-- ){
    			printf("* ");
    		}
    		printf("\n");
    	}
    	return 0;
    }

二进制数数(循环、函数)

问题描述

如5的二进制为101,包含2个“1”。


输入格式
第一行包含2个数L,R


输出格式
一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。


样例输入
2 3


样例输出
3


数据规模和约定
L<=R<=100000;


复制代码
    #include<stdio.h>
    int main(){
    	int l, r;
    	int i, j, k, num=0;
    	scanf("%d %d", &l, &r);
    	for( i=l,k=i; i<=r; i++,k=i ){
    		while( k!=0 ){
    			if( k%2==1 ){
    				num++;
    				}
    			k /= 2;
    		}
    	}
    	printf("%d", num);
    	return 0;
    }

小生物的逃逸(结构体)

问题描述
在空间中存在n个彼此互不相交也不相切的完整几何体(即为n个互不重叠、无接触边界的三维形状)。共有m个可看作质点的小生命体分布于这些几何体内某部分区域或全部外部区域中任意位置(但排除位于任何几何体表面的情况)。探讨如何让这些生物从原本的位置成功脱离至所有外部空间所需最少穿过多少层界面?


第一行两个数n、m:代表球体数量及小生物数量;
接下来n行每行给出四个参数Xi、Yi、Zi和Ri:分别表示每个球体在三维空间中的位置坐标及其半径值;
随后m行每行为三个参数Xi、Yi、Zi:描述每个小生物在三维空间中的位置坐标。


输出格式
一行m个数:表示每个小生物逃逸时至少经过的球面数。


样例输入
2 2
0 0 0 2
0 0 0 4
0 0 1
0 0 3


样例输出
2 1


规模与约束条件设定下,
n和m的取值范围均在1到100之间,
各变量绝对值不超过1万,
且半径范围在1到一万之间;
同时,
约束条件确保所有球体彼此之间不相接触,
并保证小型生物不在任何球体表面。


思路:
主要考察的是公式应用能力,在空间直角坐标系中判断小生物的位置关系时有两种情况:若各坐标轴上的差值平方之和小于或等于球面半径的平方,则认为该小生物位于球体内;反之,则认为其位于该球体外(即无需穿过此球表面)。
对于数学基础较薄弱的同学而言,面对这道题目可能会感到无从下手。但为了进一步理解题目的内在逻辑关系(即通过空间几何分析来确定物体所在位置),我们可以通过建立合理的坐标系来简化问题解决过程。

为了包含math.h头文件

  1. double型:scanf()时占位符只能用%lf; printf()时可以用%lf,也可以用%f。

复制代码
    #include<stdio.h>
    #include<math.h>
    
    struct point{
    	int x;
    	int y;
    	int z;
    };
    
    struct sphere{
    	int x;
    	int y;
    	int z;
    	int r;
    };
    
    int main(){
    	int n, m;  //n代表球的数量,m代表小生物的数量
    	int i, j, a, b, count;
    	struct point p[101];
    	struct sphere sp[1000];
    	scanf("%d %d", &n, &m);
    	for( i=0; i<n; i++ ){
    		scanf("%d %d %d %d", &sp[i].x, &sp[i].y, &sp[i].z, &sp[i].r);
    	}
    	for( i=0; i<m; i++ ){
    		scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z);
    	}
    
    	for( i=0; i<m; i++ ){
    		count = 0;
    		for( j=0; j<n; j++ ){
    			a = pow(p[i].x-sp[j].x, 2) + pow(p[i].y-sp[j].y, 2) + pow(p[i].z-sp[j].z, 2);
    			b = pow(sp[j].r, 2);
    			if( a<=b ){  //说明该质点在球中
    				count++;
    			}
    		}
    		printf("%d ", count);
    	}
    	return 0;
    }

According to Bartjens(枚举、表达式、dfs)(未解)

问题描述

注:此处"使得"已按照要求做了适当调整

注:此处"缺失"已按照要求做了适当调整

  1. 他写的数字没有前导零。例如2 10 0100=就是不可行的。
  2. 他写0的时候不会写多个0。例如2*1000+000=就是不可行的。
  3. 他只用二元运算符,不用取负。所以2*-100*-10+0=也不合法。
  4. 他只用+、-、*,不用/和括号。
  5. 这些算式按照正常的优先级顺序计算。

希望为barjen教授恢复这些题目提供帮助。为了使答案达到2000,请在算式中添加至少一个运算符并确定所有可能的组合总数。


输入格式
输入包含一组数据。这组数据有n个数字(1<=n<=9),后面跟着一个=号。


该方法具有显著效果


样例输入
2100100=


样例输出
2 100 10+0=
2 100 10-0=
2100-100=


数据规模和约定
1<=n<=9


连续正整数的和(枚举)

问题描述
该数值可通过连续自然数组成的序列求和得到,在本例中具体表现为78=1+2+3=……
请提供一个不超过一万的正整数值n(记作n≤1 000 ),系统将为您计算其可能存在的表达形式数量m个。
系统将根据最小起始值原则生成m个解,并以有序列表的形式展示结果集。


样例输入
78


样例输出
1 12
18 21
25 27


复制代码
    #include<stdio.h>
    int main(){
    	int n;
    	int i, j, sum;
    	scanf("%d", &n);
    	for( i=1; i<n/2+1; i++ ){
    		j = i;   //先把i的值存起来
    		sum = 0;
    		while( sum<n ){
    			sum += i;
    			i++;
    		}
    		if( sum==n ){
    			printf("%d %d\n", j, i-1);  //i要减1
    		}
    		i = j;
    	}
    	return 0;
    }

景点游览(排序)

问题描述


输入格式
输入的第一行表示N个景点的数量。
第二行包含了对应于每个景点的评分数值的数据项。


输出格式
输出一行,包含N个正整数,表示N个景点的评分从大到小的排列


样例输入
4
3 2 4 1


样例输出
4 3 2 1


数据规模和约定:N<=1000,每个景点的评分<=10000。


小mate子,请你务必深入掌握冒泡排序算法的核心原理和实现细节。请详细说明循环变量i和j的作用以及它们在排序过程中的具体作用。弄清楚初始化时的数据属性以及整个排序流程的工作机制。

算法提高

递归输出(递归)

问题描述
实现一个递归算法使得程序能够将整数的所有位数逐个提取并依次输出每一个数字后附加一个减号“-”。例如对于输入整数123程序应输出1-2-3-…完成此功能后还需要
并编写主程序用于测试验证该递归函数的功能。


输入格式
输入一个整数n


输出格式
如题目要求,把n的每个数字后面加一个减号”-“输出


样例输入
一个满足题目要求的输入范例。例:
123


样例输出
与上面的样例输入对应的输出。例:
1-2-3-


数据规模和约定:
输入n>0,必须使用递归调用来实现!


递归函数被称为在其自身定义的过程中被调用的一种特殊结构。
在编程逻辑中实现这一特性需要开发者深入理解递归过程中各层之间的调用关系及其退出机制。
为了掌握这一概念建议从基础原理入手逐一分析其运行流程。

复制代码
    #include<stdio.h>
    void f( int n );
    
    int main(){
    	int n;
    	scanf("%d", &n);
    	f(n);
    	return 0;
    }
    
    void f( int n ){
    	if( n==0 ){
    		return;
    	}
    	f(n/10);
    	printf("%d-", n%10);
    }

执行过程(假设输入123):

===> f (123)
===> f (12)
===> f (1)
===> f (0)
===> printf (1-) //(1%10)-
===> printf (2-) //(12%10)-
===> printf (3-) //(123%10)-

数组求和(数组)

问题描述
输入n个数,围成一圈,求连续m(m<n)个数的和最大为多少?


输入格式
输入的第一行包含两个整数n, m。第二行,共n个整数。


输出格式
输出1行,包含一个整数,连续m个数之和的最大值。


样例输入
10 3
9 10 1 5 9 3 2 6 7 4


样例输出
23


数据规模和约定
0<m<n<1000, -32768<=输入的每个数<=32767。


复制代码
    #include<stdio.h>
    int main(){
    	int a[1000];
    	int n, m;
    	int i, j, t;
    	int sum=0, max=0;
    	scanf("%d %d", &n, &m);
    	for( i=0; i<n; i++ ){
    		scanf("%d", &a[i]);
    	}
    	for( j=0; j<m; j++ ){
    		max += a[j];
    	}
    	for( i=1; i<n; i++ ){
    		for( j=i; j<i+m; j++ ){
    			sum += a[j%n];
    		}
    		if( sum>max ){
    			t = sum;
    			sum = max;
    			max = t;
    		}
    		sum = 0;  //注意 sum 要重新赋0值
    	}
    	printf("%d", max);
    	return 0;
    }

字符串顺序比较(字符函数、strcmp)

问题描述
对字符串对(s₁, s₂)进行比较,并返回结果。具体来说:当两字符串相等时,返回值为0;若s₁的字母序先于s₂则返回值为+1;反之则返回值为-1。


输入格式
输入两行,第一行输入一个字符串1,第二行输入字符串2。


输出格式
输出比较的结果


样例输入
abc
abd

样例输出
1


样例输入
English
English

样例输出
0


样例输入
hello
ha

样例输出
-1


方法一:利用string.h里的 strcmp() 函数投机取巧

复制代码
    #include<stdio.h>
    #include<string.h>
    int main(){
    	char a[1000], b[1000];
    	int res;
    	gets(a);
    	gets(b);
    	res = strcmp(a,b);
    	printf("%d", -res);
    	return 0;
    }

复制代码
    #include<stdio.h>
    int main(){
    	char a[1000], b[1000];
    	int i=0, j, res;
    	gets(a);
    	gets(b);
    	while( a[i]==b[i] && a[i]!='\0' ){
    		i++;
    	}
    	if( a[i]=='\0' && b[i]=='\0' ){
    		res = 0;
    	}
    	else{
    		res = a[i]-b[i];   // \0 的ASCII码是0
    		if( res<0 ){
    			res = 1;
    		}
    		else{
    			res = -1;
    		}
    	}
    	printf("%d",res);
    	return 0;
    }

但是,在采用这种方法时需要注意大小写的区分:例如:小写字母a与大写字母A的顺序关系如何?然而,在经过一系列测试后发现本题并不需要考虑这一问题

Monday-Saturday质因子(循环)

问题描述
这个问题属于一个不复杂且涉及数论的题目。看上去像是要求找出所有正整数的质因数分解过程;然而实际上并非如此。

本题中需要定义以下几个概念:

对于一个正整数N来说,在模7运算下余1或余6的情形下都可以表示为N=7k+{1,6}的形式;我们也可以用一种更为直观的方式来称呼这类数字——Mondays and Saturdays numbers(MS 数)。

  1. 定义:Monday-Saturday因子
    当且仅当对于任意两个MS数a, b时,则称ab的一个"Monday-Saturday因子"(简称"MS因子")。

  2. 特定的日期-星期模式(Monday-Saturday)素性

  3. Monday-Saturday质因子 当涉及到两个MS数a和b时,则称当满足以下条件之一时:

  • a是b的MS因子
  • a是一个MS质数
    此时我们说a是一个"Monday-Saturday质因子"。
    例如:我们发现,在分解216时,其分解式为27×8。

问题就是,给定一个MS数N,求其所有的Monday-Saturday质因子。


每一组输入数据由若干行组成。每一行都包含一个整数N,并且满足以下条件:N必须是MS数,并且大于1且小于30万。需要注意的是,在最后一行为数字1时无需输出相应结果。所有输入数据的总行列数均不超过100。


每个整数N将被单独列出一行,并表示为它的所有周一至周六对应的质因数的乘积,并按升序排列显示。


【样例输入】
205920
262144
262200
279936
299998
1


【样例输出】
205920: 6 8 13 15 20 22 55 99
262144: 8
262200: 6 8 15 20 50 57 69 76 92 190 230 475 575 874 2185
279936: 6 8 27
299998: 299998


数据规模和约定
1<N<300000,每个输入数据不超过100行。


以下代码测评结果为80分:

复制代码
    #include<stdio.h>
    int main(){
    	long a[101];  //用于存储输入的数据
    	long b[10000];  //存储MS数
    	long c[1000];  //用于存储因子
    	long d[1000];  //用于存储质因子
    	int i, j, k, l;
    	int n, m, q, p, count;
    
    	for( i=0; a[i-1]!=1; i++ ){  //a[i-1],若是a[i]会无限循环
    		scanf("%ld", &a[i]);
    	}
    
    	for( i=0; a[i]!=1; i++ ){
    
    		n = 0;
    		for( j=0; j<=a[i]; j++ ){  //求 0~n 之间的MS数,放在b[n]中
    			if( j%7==1 || j%7==6 ){
    				b[n] = j;
    				n++;
    			}
    		}
    
    		m = 0;
    		for( j=0; j<=n+1; j++ ){ //求N的因子,放在c[m]中
    			for( k=0; k<=n-1; k++ ){
    				if( b[j]*b[k] == a[i] ){
    					c[m] = b[j];
    					m++;
    				}
    			}
    		}
    
    		q = 0;
    		for( j=0; j<m; j++ ){  //求质因数中的MS质数
    			count = 0;
    			for( k=0; k<m+1; k++ ){
    				for( l=0; l<m+1; l++ ){
    					if( c[k]*c[l] == c[j] ){
    						count++;
    					}
    				}
    			}
    			if( count==2 ){
    				d[q] = c[j];
    				q++;
    			}
    		}
    
    		printf("%d: ", a[i]);  //注意题目中冒号后有一个空格
    		for( p=0; p<q; p++ ){
    			printf("%ld", d[p]);   //测评的时候这里漏了一个%,然后改了老半天
    			if( p!=q-1 ){
    				printf(" ");
    			}
    		}
    		printf("\n");
    	}
    	return 0;
    }

实现strcmp函数(指针)

问题描述
自行构建一个字符比较函数用于字符串大小对比功能。该函数名称可定义为int myStrcmp(char *s1,char *s2),其核心逻辑基于ASCII码值依次对两个输入字符串s1和s2进行比较操作。一旦出现不同字符或任一字符串尾部遇到'\0'终止符时,则立即终止比较过程并返回相应的结果值:若s1整体小于等于s2则返回-1或0(其中当两者完全相等时返回0),反之则返回+1表示s1大于s2。
详细来说,在逐字符对比过程中遵循如下规则:从左端开始逐一比对对应位置上的字符直至发现差异点或遍历完整个字符串为止;对于每个对比位置上:
若当前字符相同则继续下一位置比对;
若当前字符不同则直接根据ASCII码大小关系决定整体结果;
特别地,在遇到'\0'时需明确指出其作为数值最小的特殊标识符,在此情况下该特定条件将成为终止比较的关键触发因素。
举例而言:
"A"字符对应的ASCII码低于"B"对应值;
同样地,
"a"字母所代表的ASCII码高于大写字母"A";
在较长单词对比中,
"computer"明显大于"compare";
而较短单词与较长单词相比则会体现出明显的顺序特征:
"hello"小于"helloworld"


样例输出

在这里插入图片描述

数据规模和约定
字符串长度<100。


复制代码
    #include<stdio.h>
    #include<string.h>
    
    int myStrcmp(char *s1, char *s2);
    
    int main(){
    	char s1[101], s2[101];
    	gets(s1);
    	gets(s2);
    	printf("%d", myStrcmp(s1,s2));
    	return 0;
    }
    
    int myStrcmp(char *s1, char *s2){
    	int a;
    	while(1){
    		if( *s1>*s2 ){
    			a = 1;
    			break;
    		}
    		else if( *s1<*s2 ){
    			a = -1;
    			break;
    		}
    		else if( *s1==*s2 && *s1==0 ){
    			a = 0;
    			break;
    		}
    		s1++;
    		s2++;
    	}
    	return a;
    }

成绩排序(结构体)(40分)

成绩排序2(结构体)(未解)

使用指针逆序输出(指针)

历届试题

Excel地址

斐波那契

核桃的数量

翻硬币

分巧克力

公式求值

带分数

全部评论 (0)

还没有任何评论哟~