统计宿舍里4位同学的平均身高。从键盘输入4位同学的身高(输入前先在屏幕上显示提示语句),并计算4位同学的平均身高(输出保留3位小数)。
#include <stdio.h>
int main() {
float height1, height2, height3, height4;
printf("请输入第一个同学的身高:");
scanf("%f", &height1);
printf("请输入第二个同学的身高:");
scanf("%f", &height2);
printf("请输入第三个同学的身高:");
scanf("%f", &height3);
printf("请输入第四个同学的身高:");
scanf("%f", &height4);
float average = (height1 + height2 + height3 + height4) / 4;
printf("4位同学的平均身高为:%.3f\n", average);
return 0;
}
主要思想:用字符数组进行接收数字,将数字逐一逆序存储到数组中,对应位置依次相减。做法和高精度加法类似。
小学减法的做法:
1.对应位置相减,不够相减就向后一位借1
高精度减法步骤:
(1):字符数组存储大数字
(2):逆序插入整形数组
(3):对应位置数字相减,并判断当前所在位的被减数是否需要借1
(4):将数组数字逆序打印
#include<stdio.h>
#include<string.h>
const int N=100001;//(1)
int cmp(int *arr,int*brr,int len1,int len2){//(10)
if(len1==len2)
for(int i=len1-1;i>=0;i--){
if(arr[i]!=brr[i])
return arr[i]>=brr[i];
}
else
return len1>=len2;
}
void sub(int *arr,int *brr,int*crr,int len1,int len2){//(11)
int t=0;
for(int i=0;i<len1;i++){
if(i<len1)t+=arr[i];//(12)
if(i<len2)t-=brr[i];//(13)
crr[i]=(t+10)%10;//(14)
if(t<0)//(15)
t=-1;
else
t=0;
}
}
int main(){
char a[N];//(2)
char b[N];//(3)
int arr[N];//(4)
int brr[N];//(5)
int crr[N];//(6)
scanf("%s",&a);
scanf("%s",&b);
int len1=strlen(a);
int len2=strlen(b);
for(int i=0;i<len1;i++)//(7)
arr[i]=(a[len1-i-1]-'0');
for(int i=0;i<len2;i++)//(8)
brr[i]=(b[len2-i-1]-'0');
int max=len1;//(9)
if(len2>len1)
max=len2;
//默认arr数组是大于brr数组的
if(cmp(arr,brr,len1,len2)){
sub(arr,brr,crr,len1,len2);
while(crr[max-1]==0&&max>1)//(16)
max--;
for(int i=max-1;i>=0;i--)//(18)
printf("%d",crr[i]);
}
else{
sub(brr,arr,crr,len2,len1);
while(crr[max-1]==0&&max>1)//(17)
max--;
printf("-");
for(int i=max-1;i>=0;i--)//(19)
printf("%d",crr[i]);
}
}
(1)设置一个足够大的数N,用于标识数组的长度
(2)(3)创建两个字符数组,用于接收高精度数字
(4)(5)创建两个整形数组,用于逆序存储高精度数字
(6)接收相减的结果
(7)(8)将大数字逆序插入到整形数组中
(9)比较两个高精度数字的长度,用于后面消除前导0
(10)比较两个高精度数字的大小
(11)模拟减法竖式运算
(12)(13)对应位置数字相减
(14)将相减得到的结果插入到数组中
(15)判断是否需要向后一位借1
(16)(17)去除前导0
(18)(19)逆序打印结果