1 double f( int n, double a[], double x ){ 2 double ans=0; 3 // ans=a[0]; 4 for(int i=n;i>0;i--){ 5 ans=ans*x+a[i]*x; 6 } 7 // ans=ans*x; 8 ans+=a[0]; 9 return ans; 10 }
从后往前乘,每一项再乘以x以增加x的次数。
并注意最后一个为a0,其所乘的x为0次方,因此将其放在最后。
-
6-7统计某类完全平方数
判断任一给定整数
N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。1 int IsTheNumber ( const int N ){ 2 int x[10]={0}; 3 int i=0; 4 int n=N; 5 int flag=1; 6 while(n){ 7 x[i]=n%10; 8 for(int j=0;j<i;j++){ 9 if(x[j]==x[i]){flag=0;goto L2; }//flag用来判定其是否有两个数相等,一旦发现相等,便可以进行完全平方数的判断; 10 } 11 n=n/10; 12 i++; 13 } 14 if(flag) return 0; 15 L2: n=N; 16 int j=(int)sqrt((double)n); 17 if(j*j==n) return 1; 18 return 0; 19 }
本题有两个要点:第一是完全平方数(即是由一个整数的平方得到),第二是数字中至少有两个数字相同。
Tips:sqrt()函数的使用,其返回值和参数都不为int类型。其参数和返回值的类型一般相同,为double或float等。
3. 6-10 阶乘计算升级版
本题要求实现一个打印非负整数阶乘的函数。
1 void Print_Factorial ( const int N );
其中
N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。我的答案:
1 void Print_Factorial ( const int N ){ 2 if(N<0||N>1000) printf("Invalid input"); 3 else if(N==0) printf("1");//0的阶乘等于1 4 else{ 5 int c[4000]={-1};//给定数组存储计算结果。1000的阶乘位数达到了两千多位 6 int n=N; 7 int i=0;//记录数组下标 8 while(n){ //将n的每一位存入数组的对应位置(是反过来存放的) 9 c[i]=n%10;//后一位放在前面 10 n=n/10; 11 i++; 12 } 13 c[i]=-1;//以-1来表示其结尾 14 int h=0;//记录进位数值 15 n=N-1; 16 while(n){ 17 i=0; 18 while(c[i]!=-1){ 19 int x=c[i]*n+h;//每一位和n相乘,并加上上一个数的进位 20 c[i]=x%10; 21 h=x/10;//c中存放最后一位,h为其进位 22 i++; 23 } 24 while(h){//如果h还存在,则表明还有进位,此时需要增加结果的位数 25 c[i]=h%10; 26 h=h/10; 27 i++; 28 } 29 c[i]=-1; 30 n--; 31 } 32 for(int j=i-1;j>=0;j--){//从后往前打印输出 33 printf("%d",c[j]); } 34 printf("\n"); 35 } 36 }
1000的阶乘达到两千多位,因此使用long long也是无法存储的,需要借助数组来存放。
这题的每位相乘的思想和力扣题库中第2题:Add Two Numbers的思想相类似
网上的方法大多都是从前往后进行计算的
posted on
浙公网安备 33010602011771号