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++输出代码自己完善!