Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人能给我一些关于使用数组在C+中打印丰富的、完美的和有缺陷的数字的技巧吗+;?_C++_Arrays_Perfect Numbers - Fatal编程技术网

C++ 有人能给我一些关于使用数组在C+中打印丰富的、完美的和有缺陷的数字的技巧吗+;?

C++ 有人能给我一些关于使用数组在C+中打印丰富的、完美的和有缺陷的数字的技巧吗+;?,c++,arrays,perfect-numbers,C++,Arrays,Perfect Numbers,以下是我的一些代码: 我在计算如何通过perfectTest int传递数组时遇到困难。我有这样的选项:如果n为-1,则它打印出的是一个亏数;如果n为0,则它打印出的是一个完美数;如果n为1,则它打印出的是一个富足数,但我需要将数组合并到其中。我需要一些提示 //prototype int perfectTest(int n); //function int perfectTest(int n) { bool perfect; int answer; int perfe

以下是我的一些代码: 我在计算如何通过perfectTest int传递数组时遇到困难。我有这样的选项:如果n为-1,则它打印出的是一个亏数;如果n为0,则它打印出的是一个完美数;如果n为1,则它打印出的是一个富足数,但我需要将数组合并到其中。我需要一些提示

//prototype
int perfectTest(int n);


//function
int perfectTest(int n)

{   bool perfect;
    int answer;
    int perfectSum = 0;
    perfect = false;

    for(int i=1; i<=n/2; i++)
    {
        if(n % i==0)
            perfectSum = i;
    }

    if(perfectSum == n)
        perfect = true;
        answer = perfectSum;
}




//main function

int main()
{
    char option;
    int  n, m;
    bool InService = true;
    char perfectTestingOption;
    int  perfectNum;
    bool perfect = true;
    int factor;


    while (InService == true)
    {
    cout << "\t\t\nWelcome! Choose an option below\n" << endl;
    cout << "A = Perfect number testing" << endl;
    cout << "B = Greatest common divisors and least common multiples" << endl;
    cout << "C = Factorization of natural numbers" << endl;
    cout << "Q = Quit the program\n" << endl;
    cout << "Enter your choice:" << endl;
    cin >> option;

    if (option == 'A' || 'a')
    {
        cout << "\t\t\nWhich option would you like?\n" << endl;
        cout << "1" << endl;
        cout << "2" << endl;
        cout << "3" << endl;
        cout << "4" << endl;
        cin >> perfectTestingOption;

        if (perfectTestingOption == '1')
        {
            cout << "Enter a positive integer to check if it is a perfect number." << endl;
            cin >> perfectNum;


        perfectTest(0);

        for( );
        if (n == -1)
        {
            cout << "That number is a deficient number" << endl;
        }

        else if (n == 0)
        {
            cout << "That number is a perfect number" << endl;
        }

        else if (n == 1)
        {
            cout << "That number is a abundant number" << endl;
        }

        else
        {
            cout << "Number is invalid" << endl;
        }
    }
//原型
完整测试(intn);
//作用
int完美测试(int n)
{布尔完美;
int答案;
int perfectSum=0;
完美=错误;

对于(int i=1;i而言,数组只不过是由内存中某个基址的偏移量寻址的数据块。如果您有基址、元素数量和元素的数据类型,则有足够的信息将数据视为数组

您可以直接声明数组-

int array[SIZE];
其中,
SIZE
是一个整数,表示数组中元素的数量。请注意,对于
SIZE
的大值,逐字声明此值是一个坏主意,因为此语法在堆栈上分配数组,相对于主内存的大小,数组的大小受到严格限制

相反,您可以分配指针,然后初始化它们以指向某个堆空间-

int * array = new int[SIZE];
这将动态地为一个int块分配一些内存,并为您提供第一个“slot”的地址。事实证明,这就足够了,因为下一位中的括号语法充当“offset”运算符

要访问单个元素,声明数组变量后:

int foo = array[idx]
其中,
idx
是一些int。例如,如果
idx
等于1(或者用文字1替换它,或者用一个变量或表达式求值为整数1),我们将得到第一个元素“右侧”插槽1中的整数。回想一下,C(++)中数组中的第一个元素有索引0,因为程序员很疯狂,喜欢用0来索引(因为括号操作符指定了第一个元素地址的偏移量)

我们如何将数组传递给函数?如果我们知道每个数组元素的数据类型以及数组长度,传递它们的内存地址就足够了。传递并检查数组长度非常重要!如果不这样做,可能会导致可怕的后果,因为您会超出数组的边界并开始覆盖其他值(更高级的数据结构和其他编程语言可以自动执行边界检查。因为我们使用裸数组,边界检查是我们的责任。)

现在让我们回到原来的问题。假设我们有一个函数
intf(inti)
,它对传入的任何内容都做了一些很酷的处理。我们希望“arrayify”这个函数,以便它接受数组并返回数组

我们将利用这样一个事实,即我们确切地知道数组的长度,因为在我们的例子中,输出数组的大小与输入数组的大小相同。因此,我们也不必担心将该数字从arrayified函数中传递出去,尽管有一些简单的技术可以做到这一点

我们这样做:

int * __f(int * __i, int ilen)
{
    int * output = new int[ilen];
    for(int offset = 0; offset < ilen; offset++)
    {
        output[offset] = f(__i[offset]);
    }
    return output;
}
函数签名。这告诉我我将地址带到一个
ilen
int数组,并将地址返回到另一个这样的数组

    int * output = new int[ilen];
为我们的输出分配新内存。如果您完成了一块内存
foo
,则在完成后应
delete[]foo
;否则内存将保持分配状态并占用空间,直到程序终止。如果您想了解更多信息,请阅读动态内存分配

    for(int offset = 0; offset < ilen; offset++)
    {
        output[offset] = f(__i[offset]);
    }
最后,我们返回我们构造的数组。从技术上讲,我们返回一个
int*
,但这只是一种表示“一个或多个int的内存地址”的奇特方式

在整个写作过程中,我一直在使用指针语法(
*
)。对很多人来说,深入理解指针需要一段时间(包括我自己;我已经好几年没有“获得”指针!)。总之,尽管:

  • 一个
    int*foo
    形式的变量包含一个内存地址。这个内存地址在语义上被指定为指向
    int
    。但实际上,地址只是一个地址。(内存地址是与内存中特定单元相对应的数字。您可以按连续地址处理内存单元;也就是说,单元100是“相邻的”从我们的角度来看,对单元101进行编号。当我们对内存进行编号时,我们使用1字节的单元大小。较大结构的地址,如4字节
    int
    int
    s数组,是第一个元素的地址。)
  • 一旦我们声明了
    foo
    ,那么
    foo
    本身就是存储在其中的地址。如果我们想要
    foo
    指向的值,我们就说
    *foo
    *
    在这里是解引用操作符:它获取内存地址并返回内存中的内容
  • 如果我们想要一个变量的地址
    bar
    ,我们说
    &bar
    。在这个上下文中
    &
    是操作符的地址:它接受一个变量并告诉你它的位置
  • 您可以对指针进行加减运算:
    foo+3
    是一个完全有效的内存地址。但要小心!每个“1”加法和减法不是一个存储单元,而是与数组封装的类型大小相等的存储单元数。在我们的例子中,由于在大多数现代平台上,
    int
    是4字节,
    foo+3
    将3*4=12个存储单元添加到
    foo
    的地址,而不是3
  • 指针和数组是松散可互换的。特别是,
    foo[n]
    对于n的任何值都有效,正如您所期望的那样
    • for();
      这是什么???
      int-perfectTest(int-n)
      -您没有返回任何东西,或者我们
          for(int offset = 0; offset < ilen; offset++)
          {
              output[offset] = f(__i[offset]);
          }
      
          return output;