1、pow(10,3)=99
原因:
pow返回的是double类型,即浮点数,浮点数本身就是表示一个精度的数字,而不是一个准确的数字。
可能为99.999999
然后转换int所以成为99,
浮点数转换为int是可能丢失精度的。
所以浮点数不比较相等,只认为两个数字差距小到一定精度就认为相等。
2-6 数列求和
方法一:
N大于21时,AA…A(N个A)的值超过64位,超出整形的数值表示范围,用数组表示。
当前数列和
第K个数列项AA…A(K个A)
#include <stdio.h>
#include <stdlib.h>
int k[100000]={0},s[1000000]={0};
int main()
{
int n,i,j,a,m;
scanf("%d %d",&a,&n);
if(n==0)
{
printf("0");
return 0;
}
for(i=0;i<n;i++)
{
k[i]=a;
for(j=0;j<=i;j++)
{
if(s[j]+k[j]>9)
{
m=(s[j]+k[j])%10;
s[j]=m;
s[j+1]+=1;
}
else
{
s[j]+=k[j];
}
}
}
if(s[n]==0){
for(i=n-1;i>=0;i--)
{
printf("%d",s[i]);
}
}
else
{
for(i=n;i>=0;i--)
{
printf("%d",s[i]);
}
}
return 0;
}
方法二:
方法一时间复杂度:O(n^2)
每个数位的结果为(N-K)*A加上进位值
#include <stdio.h>
#include <stdlib.h>
int s[1000000]={0};
int main()
{
int n,i,j,a,m;
scanf("%d %d",&a,&n);
if(n==0)
{
printf("0");
return 0;
}
for(i=0;i<n;i++)
{
m=a*(n-i);
j=(s[i]+m)/10;
s[i]=(s[i]+m)%10;
s[i+1]+=j;
}
if(s[n]==0){
for(i=n-1;i>=0;i--)
{
printf("%d",s[i]);
}
}
else
{
for(i=n;i>=0;i--)
{
printf("%d",s[i]);
}
}
return 0;
}