求1+2+3+...+n,不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

当我们学习了static成员,友元函数,和内部类就可以用c++的两种方法解决这个问题:

1、使用静态成员的特性和友元类(也可以不用友元类)

class Sum
{public:
     Sum()//构造函数实现1+2+3+  n
     {
        
         _ret+=_i;
          _i++;
     }
    static int Getret()//静态成员函数的声明
     {
         return _ret;
     }
    static void Init()//静态成员函数的声明
    {
        _i=1;
       _ret=0;
    }
 private:
    static int _i;//静态成员变量的声明
    static int _ret;
    
};
int Sum::_i=1;
int Sum::_ret=0;//定义初始化静态成员变量。

class Solution {
public:
    int Sum_Solution(int n) {
        Sum::Init();//访问静态成员函数。
        Sum *arr=new Sum[n];//使用new,构造n个对象,则会调用n次构造函数
      
        return Sum::Getret();//访问静态成员函数。
    }
};

使用友元类:

class Sum
{
    friend class Solution;//类Solution是类Sum的友元类,则Solution 可以访问Sum的所有成员
    public:
     Sum()
     {
        
         _ret+=_i;
          _i++;
     }
    static int Getret()
     {
         return _ret;
     }
    /*static void Init()
    {
        _i=1;
       _ret=0;
    }*/
 private:
    static int _i;
    static int _ret;
    
};
int Sum::_i=1;
int Sum::_ret=0;

class Solution {
public:
    int Sum_Solution(int n) {
       // Sum::Init();
      Sum::_ret=0;//访问Sum的静态成员
      Sum::_i=1;
        Sum *arr=new Sum[n];
      
        return Sum::Getret();
    }
};

我们一般尽量不要使用友元类,这样会破坏它的封装性。

2、使用内部类

class Solution
{
    class Sum
    {
    public:
        Sum()
        {
            _ret+=_i;
            _i++;
        }
    };
public :
    int Sum_Solution(int n)
    {
        _i=1;
        _ret=0;
        
        Sum arr[n];//变长数组
        
        return _ret;
        
      
            
    }
private:
   static int _i;
   static int _ret;
     
};
int Solution::_i=1;
int Solution::_ret=0;

Sum是Solution的内部类,Sum是Solution的友元类,则Sum可以访问Solution的私有成员和静态成员。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1 《计算机程序设计》中常用算法复习 一、常用算法有 8 个方面: 1、递推算法(级数、数列和、二分法、梯形法、穷举法 等) 2、排序算法(选择法排序、冒泡法) 3、查找算法(顺序查找 、折半查找、统计、和、计数) 4、有序数列的插入、删除操作 5、解算法(最大数、最小数、素数、最大公约数、最小 公倍数) 6、矩阵的处理(生成矩阵、交换和基本运算) 7、递归算法(阶乘、最大公约数) 8、字符串处理(插入、删除、连接和比较) 二、常用算法的应用举例:(有 21 个程序) 1、计算 S=1+2+…+100 的值。(和、统计) 2、找出 100~999 之间的所有"水仙花数"(穷举法、统计) 3、从键盘输入 10 个数,然后找出其中的最大值和最小值。 (找最大数、最小数) 4、任意输入 n 个数,按由小到大的顺序排列并显示输出。 (排序算法--选择法排序) 5、(对字符串排序处理)有 5 个英文单词,分别为:Word, Excel,Powerpoint,Type,Angle,要设计出如下程序: 2 (1)在键盘上输入数 N(本例输入 5),把英文单词放 入名为 X 大小为 N 的数组中 (2)显示出 X 数组中的英文单词 (3)对数组中的英文单词从小到大排序 (4)显示出排序后 X 数组中英文单词 6、 5 的阶乘值(5!=?) 7、计算 t=1!+2!+……+10! (即阶乘之和)。 计算 t=1!+2!+……+10! 即阶乘之和(双循环)。 8、多项式 S=1+2+22+23+……+232,请设计一个程序, S 的 值。 9、除了 1 和它本身之外不能被任何一个整数所整除的自然 数叫质数,除去 2 之外,其它质数都是奇数,又称为素数。 请设计一个程序,在屏幕上输出 3——150 之间的所有素数。 10、设计 1 个程序,要是:(查找算法、统计、和、找 素数或质数) (1)在键盘上输入 1 个不小于 3 的自然数 N (例输入 10) , 出其不到第 N 个自然数中奇数之和,并输出结果 (2)输出 1 到第 N 自然数中所有质数的个数 11、穷举法,整钱找零.prg 程序如下: *(1)穷举法整钱找零.prg"、 *整钱找零:100=x1*10+x2*5+x3*1 3 *x1,x2,x3>=1,x1+x2+x3=20 for x1=1 to 10 for x2=1 to 20 x3=20-x1-x2 if 100=x1*10+x2*5+x3*1 and x3>0 then ?x1,x2,x3 endif next x2 next x1 12、级数.prg 程序如下: *级数 1.prg" *s=1+1/2-1/3+1/4+.... s=1 d=1 clear input "输入 N:"to n for i=2 to n s=s+d*1/i d=-d ?S 4 next i ?"s=",s 13、数列.prg 程序如下: *数列 2.prg" fibnocsi 数列 f1=1 f2=1 ??f1,f2 for i=1 to 20 f2=f2+f1 f1=f2-f1 ??f2 next i 14、生成矩阵.prg 程序如下: *(4)生成矩阵.prg" clear dime a(5,5) for i=1 to 5 for j=1 to 5 do case 5 case i<j a(i,j)=2 case i=j a(i,j)=1 otherwise a(i,j)=3 endcase next j next i for i=1 to 5 for j=1 to 5 ?? a(i,j) next j ? next i 15、查找算法(顺序查找.prg) 程序如下: *(1)顺序查找.prg" clear dime a(10) for i=1 to 10 a(i)=int(rand()*100) 6 ??a(i) next i input "输入要查找的数:" to x for i=1 to 10 if a(i)=x ?"找到:",x,i return endif next i ?"没有找到!" 16、查找算法(折半查找.prg") 程序如下: *(2) 折半查找.prg"(先排序,后查找) clear dime a(10) n=10 for i=1 to 10 a(i)=int(rand()*100) ??a(i) next *排序 for k=1 to n-1 7 for j=k+1 to n if a(k)>a(j) t=a(k) a(k)=a(j) a(j)=t endif endfor ? a(k) endfor ?a(n) return *折半查找 input "输入要查找的数:"to x l=1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值