【问题标题】:C++ pyramid of numbersC++ 数字金字塔
【发布时间】:2012-02-25 11:47:32
【问题描述】:

我需要编写一个程序,从文件中获取 2 个整数。然后它必须从这两个数字中制作一个金字塔。它必须看起来像这样:

我已经编写了代码,它可以按照我的意愿工作,我敢打赌我想不出如何让它看起来像金字塔。

这就是我这样做时的样子:

这是我的代码:

#include <fstream>
using namespace std;

    int main(){

        ifstream inFile("Duomenys.txt");
        ofstream outFile("Rezultatai.txt");
        int N,M,smth,suma=0;

        inFile >> N >> M;
        smth=N;

        while(N<=M){
            for(int i=smth;i<=N;i++){
                outFile<<i<<" ";
                suma+=i;
                if(i==N){
                    for(int i=N-1;i>=smth;i--){
                        outFile<<i<<" ";
                        suma+=i;
                    }
                }
            }
            outFile<<endl;
            N++;
        }
        outFile<<endl<<"Skaiciu suma: "<<suma;

        inFile.close();
        outFile.close();
        return 0;
    }

所以我的问题是,如何使我的答案像示例中那样呈金字塔形?

【问题讨论】:

  • 预先计算最后一行的宽度,然后使用该信息使每一行居中。
  • 我也想知道怎么做 <.>
  • 您可能还想看看width 参数。
  • 嗯...想想。你知道最后一行有多少个数字吗?你知道每个数字占用多少空间吗?
  • 假设一个等宽字体(对于所有终端的 99% 来说都足够真实),您可以将每行的字符数计算为“宽度”。

标签: c++ fstream


【解决方案1】:
#include <fstream>
#include <iostream>
#include <iomanip>
#include <assert.h>

using namespace std;

template <class T>
int numDigits(T number)
{
    int digits = 0;
    while (number) {
        number /= 10;
        digits++;
    }
    return digits;
}

int main()
{
    ifstream inFile("Duomenys.txt");
    ofstream outFile("Rezultatai.txt");
    int N,M,smth,suma=0;

    inFile >> N >> M;
    smth=N;

    // assuming positive numbers
    assert(N>=0 && M>=0);
    // this will be the size of each printed number
    int nd = numDigits<int>(M)+1;

    while(N<=M){
        for(int i=N;i<=M;i++)
            outFile << setw(nd) << " ";
        for(int i=smth;i<=N;i++){
            outFile << setw(nd) << i;
            suma+=i;
            if(i==N){
                for(int i=N-1;i>=smth;i--){
                    outFile << setw(nd) << i;
                    suma+=i;
                }
            }
        }
        outFile<<endl;
        N++;
    }
    outFile<<endl<<"Skaiciu suma: "<<suma;

    inFile.close();
    outFile.close();
    return 0;
}

【讨论】:

  • 如果所有数字都打印在一个唯一的字符串中,这是可行的
【解决方案2】:

首先,您必须计算第二个数字的位数。它是如此容易。然后您可以使用:(第二个数字 - 第一个数字)+1 计算得出的金字塔的深度。之后,您可以确定在最后一行中,您将拥有的最大位数是 ((第二个数字 - 第一个数字)*2+1)*digit count=x of pyramid's head。所以你应该在 (x,y)=(x of pyramid's head, ....) 处打印金字塔的头部。

【讨论】:

    【解决方案3】:

    要确定最后一行的长度,您可以将输出写入std::stringstream 并使用myStrStream.str().size() 获取长度(然后将字符串流的内容打印到std::cout 或outFile)或者您可以分别计算最后一行所有项的长度,然后求和,包括空格。我认为第一种方法更简单。

    最简单的方法可能是回溯。

    【讨论】:

      【解决方案4】:

      这也取决于每个数字的位数。 假设每个数字都有两位数,就足以为每次迭代增加一定数量的空间。 在您的情况下,此数字在第一次迭代期间为 5,最终为零:

      #include <fstream>
      using namespace std;
      
      int main(){
      
          ifstream inFile("Duomenys.txt");
          ofstream outFile("Rezultatai.txt");
          int N,M,smth,suma=0;
      
          inFile >> N >> M;
          smth=N;
      
          while(N<=M){
              for(int i=smth;i<=N;i++){
                  outFile<<i<<" ";
                  suma+=i;
                  if(i==N){
                      for(int i=N;i<M;i++)
                          cout << "  ";
                      for(int i=N-1;i>=smth;i--){
                          outFile<<i<<" ";
                          suma+=i;
                      }
                  }
              }
              outFile<<endl;
              N++;
          }
          outFile<<endl<<"Skaiciu suma: "<<suma;
      
          inFile.close();
          outFile.close();
          return 0;
      }
      

      另一种方法是使用 iomanip 的 setw,但这种情况下,您必须将所有数字写入一个字符串并每次打印整个字符串。

      【讨论】:

        【解决方案5】:
        #include<fstream>
        using namespace std;
        ofstream outFile("output");
        void printSpace(int a){
            string spaces(a,' ');
            outFile<<spaces;
        }
        int main(){
            int N=1,M=11,smth=4,suma=0;
            int l=2*(M-N);
            while(N<=M){
                printSpace(l);
                for(int i=smth;i<=N;i++){
                    outFile<<i<<" ";
                    suma+=i;
                    if(i==N){
                        for(int i=N-1;i>=smth;i--){
                            outFile<<i<<" ";
                            suma+=i;
                        }
                    }
                }
                l-=2;
                outFile<<endl;
                N++;
            }
            outFile<<endl<<"Skaiciu suma: "<<suma;
        
            outFile.close();
            return 0;
        }
        

        【讨论】:

          【解决方案6】:
          inFile >> N >> M;
                  smth=N;
          
                  while(N<=M){
                      for(int position=0;position<(M-N);position++){  // doesn't work if M<N obviously
                          for(int digit=(smth+position);digit;digit=digit/10){
                              outFile<<" ";
                          }
                          outFile<<" "; // this is to complement the spacer for each digit in your code
                      }
                      for(int i=smth;i<=N;i++){
                          outFile<<i<<" ";
                          ...
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-14
            • 2017-06-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多