给定一个整数k
,预计会找到小数103993/33102
的值,截断到k
小数位。所以我的方法如下:
int k ;
scanf("%d",&k);
printf("3");
if(k>0)
printf(".");
long long int num=30;
long long int numer = 1039930;
long long int denom = 33102;
while(k--)
{
long long int bro = numer/denom;
printf("%lld",bro-num);
num=bro;
num*=10;
numer*=10;
}
但如果k
为20
,则会显示一个奇怪的答案......循环中出现任何问题?
http://ideone.com/dndib2
答案 0 :(得分:5)
如上所述,long long int
溢出。这通过简单的长手划分显示了类似的方式,你甚至不需要long long int
来计算它,更不用说尝试用魔术数字“修复”它。
#include <stdio.h>
int main (void) {
int places = 20;
int numer = 103993;
int denom = 33102;
int quot;
int i;
// integral part
quot = numer / denom;
printf("%d.", quot);
numer -= denom * quot;
// fractional part
for(i=0; i<places; i++) {
numer *= 10;
quot = numer / denom;
printf("%d", quot);
numer -= denom * quot;
}
printf("\n");
return 0;
}
节目输出:
3.14159265301190260407
编辑:小数位数的唯一限制是循环控制变量大小。如果需要,相同的代码将打印巨大的小数位数。
答案 1 :(得分:1)
你的问题是溢出的。
在循环中使用num *= 10;
和numer *= 10;
,循环20次表示10 ^ 20(10到20的幂),long long int
为64位,它可以保持最大值18,446,744,073,709,551,615(2 ^ 64-1),小于10 ^ 20。