【发布时间】:2020-07-08 02:21:18
【问题描述】:
该程序将采用 3 个整数值 a、b 和 N。 该程序将从 (a/b) 的除法值到 N 个数字中找到小数之和。 例如:
抱歉,我的技术英语不是很好,我的程序(C 语言)应该执行以下操作:
- 它采用 a、b 和 N 的值
- 它执行a和b的划分
- 将浮点数除法分为整数和小数部分
- 它添加到向下舍入的小数部分的总和
- 它通过乘以 10 来更新基本除法值
- 更新n=N循环的条件
- printf 中的输出。
但是,我的程序只给出正确的值,直到 a=252525 b=99 N=33 output=171 我认为这是错误的。请帮我纠正我的算法。
#include<stdio.h>
int main()
{
unsigned int a, b, N;
int n;
double x,inte, frac; //x is output, integer part, fractional part
long double div; //division value of a/b
printf("Enter so nguyen duong a : \n"); scanf("%d",&a);
printf("Enter so nguyen duong b : \n"); scanf("%d",&b);
printf("Enter so nguyen duong N : \n"); scanf("%d",&N);
div = (long double) a / (long double)b;
x = 0;
for(n=0;n<N;n++)
{
frac = modf(div,&inte); //perform separating integer and fractional part of division
x = x + (int)floor(frac*10); //round down the fractional part of division
div=frac*10;
}
printf("a / b = %.20f\n",(double) a / (double)b);
printf ("tong cua %i chu so sau dau phay la = %.0f\n",N,x);
}
【问题讨论】:
-
为什么用
long doublemodf()调用double函数?modfl()将提供long double分数。否则为什么不简单地做一个double划分? -
对于较大的 N 值,您使用的技术将不起作用。例如,在测试 5 中,正确的除法结果是 336.666666... 6s 永远重复。但是
div中的结果实际上是 336.6666666666666666574148...所以您的代码最多只能用于 16 的 N。 -
修复程序没有简单的方法。我认为您需要使用小学长除法算法来实现除法,并寻找重复模式。或者只是继续除法,直到你计算出足够的数字。
-
要么必须实现长除法算法,要么必须使用任意精度算术库来解决任意整数的问题。
-
是的,我根本不知道或尝试那么多功能。很高兴知道我可以简单地使用 modfl() 而不是 modf。