考研复试-----C语言上机操作(三)

上接(考研复试-----C语言上机操作(二)

【注】为了大家更方便的看完题目,从此以后将代码放在文章末尾!

第一题:

    1,问题描述:输入3个数a,b,c,按大小顺序输出。

    2,问题思路:  三个数你可以选择采用排序算法求出,但是明显这个题目用if语句判断更加的方便,因此我们采用if语句。

    3,参考代码:  见example1

第二题:

    1,问题描述输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    2,问题思路:  比较出最大最小,然后进行交换。

    3,参考代码:见Example2

第三题:

    1,问题描述:字符串排序。

    2,问题思路:通过C语言自带的处理字符串的函数来解决此问题。

    3,参考代码:见Example3

第四题:

    1,问题描述:高精度乘法计算

    2,问题思路:参考博客(C语言羁绊之高精度算法

        使用数组来帮助解决位数过长的数值的计算。其中最关键的部分我觉得有两步,一是求结果数组各元素的值,二就是移位操作。由于篇幅的关系,我们只在此简单说明一下。详情请看上述链接!

    3,参考代码:见Example4

---------------------------------------------------------

参考:考研复试-----C语言上机操作(四)

---------------------------END--------------------------

Example 1

#include "stdio.h"

/*****************************
*函数名:swap
*函数作用:交换两个整数
*参数:*a--第一个数的地址	*b--第二个数的地址 
*返回:无 
******************************/

void swap(int *a, int *b){
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
} 

//主函数 
int main(){
	int a,b,c;
	
	printf("请输入三个数(中间用空格隔开):");
	scanf("%d %d %d",&a,&b,&c);
	printf("排序前的数字为:a = %d,b = %d,c = %d。\n",a,b,c);
	
	if( a > b)					//进行大小的判断 
		swap(&a,&b);
	if( a > c)
		swap(&a,&c);
	if( b > c)
		swap(&b,&c); 
	
	printf("排序后的数字为:a = %d,b = %d,c = %d。",a,b,c);
} 

Example 2(有更好的办法,这太繁琐)

#include "stdio.h"

/*****************************
*函数名:move_maxnum
*函数作用:把长度为n的数组最大数移到第一位
*参数:*arr--数组第一个元素的地址	n--数组的长度 
*返回:无 
******************************/

void move_maxnum(int *arr, int n){
	int i,j,max,temp;
	temp = arr[0];
	for( i = 1;i < n;i++){
		if(arr[i] > arr[0]){
			arr[0] = arr[i];
			j=i;
		}
	}
	arr[j] = temp; 
} 

/*****************************
*函数名:move_minnum
*函数作用:把长度为n的数组最大数移到第一位
*参数:*arr--数组第一个元素的地址	n--数组的长度 
*返回:无 
******************************/

void move_minnum(int *arr, int n){
	int i,j,min,temp;
	temp = arr[n-1];
	for( i = 1;i < n;i++){
		if(arr[i] < arr[n-1]){
			arr[n-1] = arr[i];
			j=i;
		}
	}
	arr[j] = temp; 
} 

//主函数 
int main(){
	int i,a,b,c,n;
	
	printf("请输入数组的最大个数:");
	scanf("%d",&n);
	 
	int arr[n];
	
	printf("请输入数组每个元素的值:");
	for(i = 0; i < n;i++){
		scanf("%d",&arr[i]); 
	}
	
	printf("操作前:");
	for(i = 0; i < n;i++){
		printf("%d ",arr[i]); 
	}
	
	move_maxnum(arr,n); 
	move_minnum(arr,n); 
	
	printf("\n操作后:");
	for(i = 0; i < n;i++){
		printf("%d ",arr[i]); 
	}
	return 0;
} 

Example 3

#include "stdio.h"
#include<string.h>   

void swap(char *str1,char *str2);
int main(){
	char str1[20],str2[20],str3[20];
	printf("请输入三个字符串,每个字符串以回车结束!\n");
	gets(str1);
	gets(str2);
	gets(str3);
	if(strcmp(str1,str2)>0) swap(str1,str2);
	if(strcmp(str2,str3)>0) swap(str2,str3);
	if(strcmp(str1,str3)>0) swap(str1,str3);
	printf("排序后的结果是:\n");
	printf("%s\n%s\n%s\n",str1,str2,str3);
	return 0;
}

void swap(char *str1,char *str2){
	char tem[20];
	strcpy(tem,str1);
	strcpy(str1,str2);
	strcpy(str2,tem);
}

Example 4 高精度乘法计算

/*************************
*file name:高精度乘法计算 
**************************/

#include "stdio.h"
#include "string.h"

/*************************
*函数名: init()
*作用: 先将字符串的数组转至数字数组
*参数:	*a - 存放整数的数组   *numberN -存放字符串的数组 	n-数组的长度 
*返回值:无 
*************************/

init(int *a,char *c,int n){
	int i,j;
	for(i = 0,j=n-1;i<n;i++,j--){
		a[i] = c[j] - '0';
	}
} 

/*************************
*函数名: init_c()
*作用: 初始化数组c,将其所有元素设置为0 
*参数:	*c - 存放乘法结果的数组   	n-数组的长度 
*返回值:无 
*************************/

init_c(int *c,int n){
	int i;
	for(i=0;i<3000;i++){
		c[i] = 0;
	}
} 

/*************************
*函数名: operation_c()-----重要 
*作用: 算出c数组的每一位
*参数:	*a - 存放整数的数组a  *b - 存放整数的数组b  *c - 存放结果的数组b 
*  n-数组a的长度	m-数组b的长度 
*返回值:无 
*************************/

operation_c(int *a,int *b,int *c,int n,int m){
	int i,j;
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			c[i+j] += a[i]*b[j];
		}
	}
} 

/*************************
*函数名: processing_carry()
*作用: 处理c数组中的进位问题 
*参数:	*c - 存放结果的数组c   n - 存放结果的数组长度 
*返回值:无 
*************************/

processing_carry(int *c,int n){
	int i;
	for(i=0;i<n;i++){
		if(c[i] >= 10){
			c[i+1] += c[i]/10;
			c[i] = c[i]%10;
		}
	}
} 


//主函数 
 int main(){
 	char numberN[1500],numberM[1500];
	scanf("%s%s",numberN,numberM);
	int n = strlen(numberN),m = strlen(numberM);
	int a[n],b[m];
	int i,j;

	//init 初始化,先将字符串的数组转至数字数组 
	init(a,numberN,n);
	init(b,numberM,m);

	int c[3000];
	//初始化c数组 
	init_c(c,m+n);
	//计算出c每一位的值(没有考虑进位) 
	operation_c(a,b,c,n,m); 
	//处理进位 
	processing_carry(c,n+m);
	//由于大部分的运算不可能到3000位,因此我们为了减少遍历,加入了一个判空的操作
	for(j=2999;j>0;j--){
		if(c[j] != 0)
		break;
	}
	//倒序输出我们的数组,别忘了,我们规定的是a[0]是个位 
	for(i=j;i>=0;i--){
		printf("%d",c[i]);
	}
	printf("\n");
 	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/zzzzlei123123123/article/details/79610702