大一c语言:
求解答:1.平均捐款额应该是48.666667,请问为什么这个程序输出的是48.666668?
2.请问有什么方法能输出48.666666?
下面是我写的程序
#include <stdio.h>
void main()
{
int i,j,t,p=0;
int a[15];
float b,s=0;
printf("输入单人捐款额:");
for(i=0;i<15;i++)
{
scanf("%d",&a[i]);
if(a[i]>0) p++;
}
for(i=0;i<15;i++)
s=s+a[i];
b=s/15;
for(i=0;i<14;i++)
for(j=i+1;j<15;j++)
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("有%d个人捐款了\n",p);
printf("捐款人平均的捐款额为:%f\n",b);
printf("将捐款额从大到小排序依次为:");
for(i=0;i<15;i++)
printf("%d ",a[i]);
printf("\n");
}
浮点数存在精度误差,这是很正常的现象,你可以用double,再四舍五入
正常,你可以尝试了解一下计算机是如何表示小数点后面的数,这个在计算机组成原理里有详细描述
/*7.16写一函数,输入一个十六进制数,输出相应的十进制数。*/
int hexToDec(char arr[]){
int i,len,c,res=0;
len=strlen(arr)-1;
for(i=len;i>=0;i--){
c=arr[i];
if(c>'9'){
c=10+c-'A';
}else{
c=c-'0';
}
res+=c*pow(16,len-i);
}
return res;
}
/*10进制转十六*/
void DecToHex(int n){
char arr[n];
int t,i=0;
while(n>0){
t=n%16;
if(t>9){
arr[i]='A'+t%10;
}else{
arr[i]='0'+t;
}
i++;
n=n/16;
}
i--;
for(;i>=0;i--){
printf("%c",arr[i]);
}
}
int main(){
char arr[100];
int t;
printf("请输入一个16进制:");
scanf("%[^\n]",arr);
t=hexToDec(arr);
printf("%s的十进制为%d\n16进制为:",arr,t);
DecToHex(t);
printf("end\n");
return 0;
}
/*二进制转10进制*/
int binary2Decimal(long n){
int res=0,i=0,oz=0;
while(n>0){
oz=n%10;
res=res+oz*pow(2,i++);
n=n/10;
printf("n为%d\n",n);
}
return res;
}
/*十进制转二进制*/
long long decimal2Bin(int n){
int res=0,i=1,oz=0;
while(n>0){
oz=n%2;
res+=oz*pow(10,i);
i++;
n=n/2;
}
return res;
}
/*八进制转十进制*/
int octal2decimal(long long n){
int res=0,i=0,oz=0;
while(n>0){
oz=n%10;
res+=oz*pow(8,i);
i++;
n=n/10;
}
return res;
}
/*十进制转八进制*/
long long decimal2octal(int n){
int res=0,i=1,oz=0;
while(n>0){
oz=n%8;
res+=pow(10,i)*oz;
n=n/8;
i++;
}
return res;
}
/*八进制转二进制*/
long long octal2bin(long long n){
int res=0,i=0,oz=0;
/*八转十*/
while(n>0){
oz=n%10;
res+=oz*pow(8,i);
n=n/10;
i++;
}
n=res;
res=0,i=1,oz=0;
/*十转二*/
while(n>0){
oz=n%2;
res+=oz*pow(10,i);
n=n/2;
i++;
}
return res;
}
/*二进制转八进制*/
long long bin2octal(long long n){
int res=0,i=0,oz=0;
/*二转十*/
while(n>0){
oz=n%10;
res+=oz*pow(2,i);
i++;
n=n/10;
}
n=res;
res=0,i=1,oz=0;
/*十转八*/
while(n>0){
oz=n%8;
res+=oz*pow(10,i);
i++;
n=n/8;
}
return res;
}