基础练习:1082:求小数的某一位

1082:求小数的某一位
【题目描述】
分数ab化为小数后,小数点后第n位的数字是多少?

【输入】
三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b<100,1≤n≤10000。

【输出】
一个数字。

【输入样例】
1 2 1
【输出样例】
5

一个思路是:可不可以通过取余将小数点后的数表示出来,再对第几位进行筛选

#include<iostream>
using namespace std;
int main()
{int a,b,n,i,x,m;
cin>>n;

m=(a%b*10)/a;
for(i=1;;i++)
{cin>>a>>b;
}cout<<x<<endl;
    return 0;
}

写到这就不知道怎么写下去了,不知道这个思路可不可行。
查了一下相关题解,另一种思路,但还不是很理解:

#include<cstdio>
int main()
{
	int a,b,n,i,c;
	scanf("%d%d%d",&a,&b,&n);
	c=a;
	for(i=1;i<=n;i++)
	{
		c%=b;
		c*=10;
	}
	c/=b;
	printf("%d",c);
}

用double变量来存a/b的值然后成10的n次方,在求个位就行了,但这只能针对小数据,数据一大,double就会有误差。
正确思想是将数裁开分开计算,这样可以让大数字变成小数字从而做到较大数据0误差
来源

求解释。

<收获>

取余,遵循尽可能让商大的原则
取模,遵循尽可能让商小的原则
取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时会有区别,所以要特别注意异号的情况。
1.取模
5 mod 3 = 2
-5 mod 3 = 1
5 mod -3 = -1
2.取余
5 rem 3 = 2
-5 rem 3 = -2
5 rem -3 = 2
余数在数学中的定义是始终大于等于0的,而对于某些编程语言的取余运算不是按照上面的定义来执行的,因此才会出现余数小于0的情况。
来源

double型的小数,在求第n位小数是什么的时候,会出现精度的误差:
C语言里面,默认%f是小数点后6位,如果想小数点后面16位,写成%.16lf
不会自动四舍五入的,double是一个近似值,通常没有办法做的很精确.
通常能精确到小数点后面5,6位,也就是说超过5,6位了可能就不准了。
来源

猜你喜欢

转载自blog.csdn.net/qq_43886420/article/details/85002320