PTA—习题2.3 数列求和-加强版 (20 分)

it2022-05-05  230

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]); 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); 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; }

最新回复(0)