C ++金字塔的数字

时间:2012-02-25 11:47:33

标签: c++ fstream

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

enter image description here

我已经编写了代码,它可以按照我的意愿运行,打赌我无法想到如何让它看起来像金字塔一样。

以下是我的表现:

enter image description here

这是我的代码:

#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;
    }

所以我的问题是,如何使我的答案像金字塔形状一样形成?

6 个答案:

答案 0 :(得分:0)

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<<" ";
                ...

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

#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;
}

答案 4 :(得分:0)

这还取决于每个号码所具有的数字。 假设每个数字都有两位数,足以为每次迭代添加一定数量的空间。 在您的情况下,此数字在第一次迭代期间为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 :(得分:0)

#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;
}