1. 6-2多项式求值问题

 
 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次方,因此将其放在最后。

  1. 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 2020-05-04 17:17  六九八  阅读(270)  评论(0)    收藏  举报