输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位,a,b<=10^6,c<=100
输入包含多组数据,结束标志为a=0,b=0,c=0;
1 6 4 0 0 0Output:
Case1: 0.1667程序:
#includeinput:using namespace std; typedef long long ll; typedef long double ld; typedef pair pii; const int inf=0x3f3f3f3f; const int maxn=1e6+5; void solve(){ int a, b, c; int cnt = 0; while(scanf("%d%d%d",&a,&b,&c)&&(a||b||c)){ cnt++; printf("Case%d:%.*lfn",cnt, c, 1.0 * a / b); // 小数点.后“*”表示输出位数,具体的数据来自参数表 // printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量 // 方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”。 } } int main(){ solve(); return 0; }
1 3 100 1 6 4 0 0 0output:
Case: 1: 0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000000000000000000000 Case: 2: 0.1667错误原因:double的有效精度只有16位。 AC代码:
#includeinput:using namespace std; void solve(){ int a,b,c,kase = 0; while (~scanf("%d%d%d", &a, &b, &c)) { if (!a && !b && !c) break; kase++; //先输出小数点前的数字 printf("Case: %d: %d.", kase, a/b); a %= b; //输出小数点后的c-1位 for (int i = 0; i < c-1; ++i) { a *= 10; printf("%d", a/b); a %= b; //跳出时a为c-1位运算后的余数 } //考虑最后一位四舍五入 int more = ((a*10)%b * 10) / b; //观察第c位的后一位 if (more >= 5) printf("%dn", (a*10)/b + 1); else printf("%dn", (a*10)/b); } } int main(){ solve(); return 0; }
1 3 100 1 6 4 0 0 0output:
Case: 1: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 Case: 2: 0.1667
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)