上接(考研复试—–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
———————————————————
—————————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;
}