我需要编写一个程序,它从文件中获取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;
}
所以我的问题是,如何使我的答案像金字塔形状一样形成?
答案 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;
}