第四题关于有效数字

P2433 【深基1-2】小学数学 N 合一

shujihao @ 2021-10-24 22:34:03

看题解貌似没人去算有效数字,都是直接数据计算输出的,这里分享一下自己的算法,主要是提供一下思路,用于求未知数据进行有效数字输出。

//代码如下(只是一个函数,不是原代码) void w4(){ double x; int x,y,i; x=(double)500/3;//注意要转换成double类型,不然小数位会丢失 x=(int)x;//转存整数位。 for(i=0;;i++) { int j=x_/pow(10,i);//pow是幂函数,第一个数是底数,第二个数是次方 if(j==0) break; }//得出整数位的位数i; //分情况进行有效数字输出 if(i<7){ int k=6-i; switch(k){ case 0:printf("%.0lf",x);break; case 1:printf("%.1lf",x);break; case 2:printf("%.2lf",x);break; case 3:printf("%.3lf",x);break; case 4:printf("%.4lf",x);break; case 5:printf("%.5lf",x);break; case 6:printf("%.6lf",x);break; } }//位数比六大一般不会求六位有效数字,误差太大 }

欢迎交流,进行其他有效数字可以直接改代码,但是要是涉及高位有效数字就会很麻烦,希望有大佬能改良思路。


by kaslad @ 2021-10-24 22:35:45

艹,这该死的压行


by shujihao @ 2021-10-25 19:18:20

第一次用洛谷,不知道咋搞的它压行了(悲ing)重新发下看看:

void w4(){

double x;
int x_,y,i;
x=(double)500/3;x_=(int)x;
for(i=0;;i++)
{
    int j=x_/pow(10,i);
    if(j==0) break;
}//得出整数位的位数i;
 if(i<7){
    int k=6-i;
    switch(k){
        case 0:printf("%.0lf\n",x);break;
        case 1:printf("%.1lf\n",x);break;
        case 2:printf("%.2lf\n",x);break;
        case 3:printf("%.3lf\n",x);break;
        case 4:printf("%.4lf\n",x);break;
        case 5:printf("%.5lf\n",x);break;
        case 6:printf("%.6lf\n",x);break;
    }
 }//位数比六大一般不会求六位有效数字,误差太大 

}


by shujihao @ 2021-10-25 19:22:59

@shujihao 第一次用洛谷,不知道为啥代码被压行了,重发一遍,顺便问问咋发代码不会被压,为毛括号里加个换行就不会被压了,搞不懂orz

void w4(){

double x;
int x_,y,i;
x=(double)500/3;x_=(int)x;
for(i=0;;i++)
{
    int j=x_/pow(10,i);
    if(j==0) break;
}//得出整数位的位数i;
 if(i<7){
    int k=6-i;
    switch(k){
        case 0:printf("%.0lf\n",x);break;
        case 1:printf("%.1lf\n",x);break;
        case 2:printf("%.2lf\n",x);break;
        case 3:printf("%.3lf\n",x);break;
        case 4:printf("%.4lf\n",x);break;
        case 5:printf("%.5lf\n",x);break;
        case 6:printf("%.6lf\n",x);break;
    }
 }//位数比六大一般不会求六位有效数字,误差太大 

}


by shujihao @ 2021-10-25 20:01:25

刚刚在讨论区看见了大佬的说法,c可以直接用"%.6g"来输出六位有效数字,简单的不行,学到了(阿巴阿巴jpg)


by 冬风秋雨 @ 2021-12-18 17:03:19

额,实不相瞒,直接输出答案就可以


by laibanet @ 2022-02-17 23:46:53

个人牢骚,不予理睬:被这问题困扰了许久,比较讨厌(烦死了)!

思路:按照指定精度输出字符串,再转换成数字。(不是我想出来的,看到大佬一篇文章提到过);

C代码:

#include<stdio.h>
#include<stdlib.h> 
double convert1(int precision, double val) {
    char buffer[128];//创建一个字符串,用于接收
    sprintf(buffer, "%.*g", precision, val);//这里建议自行搜索学习!
    return atof(buffer);//把刚才得到的字符串转成数字输出。
}
int main()
{
  // 请自行完成问题 4 的代码
        double all_water = 500;
        double average_number;
        average_number   = convert1(6,all_water/3.0);//6代表保留六位有效数字!后面的需要保留的数字。
        printf("%f",average_number);//输出默认保留6位小数,需要保留其他小数位的修改%f这里就行(%.1f一位);
  return 0;
}

c++的转换代码:

#include <sstream>

template<int PRECISION>
double convert2(double input) {
    std::stringstream is;
    double res;
    is.precision(PRECISION);
    is << input;
    is >> res;
    return res;
}

//c++输出代码自己完善!


|