吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 851|回复: 9
收起左侧

[求助] C++输出斐波那契数列格式问题

[复制链接]
cdyangjian 发表于 2023-8-18 20:59

Faibonacci数歹U 刖几项为:0, 1, 1, 2, 3, 5, 8,―,其规 律是从第三项起,每项均等于前两项之和。求前n项, 并以每行5个数的格式输出。
输入
一个正整数n (3<=n<=30),表示斐波那契数列的项 数。
输出
若干行,每行五个数,每个数使用10个位置输出。
样例输入
7
样例输出
     0     1     1     2     3
     5     8
[C++] 纯文本查看 复制代码
#include <bits/stdc++.h>
using namespace std; 
int main()
{
	int i,a,b,c,d,e=3;
	b=a=1;
	cin>>d;
	if(d>=3&&d<=30)
	{
		cout<<setw(10)<<"0"; 
		cout<<setw(10)<<a;
		cout<<setw(10)<<b;
		for(i=3;i<=d-1;i++)
		{
			e++;
			c=a+b;
			cout<<setw(10)<<c;
			a=b;
			b=c;
			if(e==5)
			{
				cout<<endl;
			}
		}
	}
	return 0;
} 


求指教,我的代码提示:“格式错误”。是什么原因呢?
球.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

熊猫拍板砖 发表于 2023-8-18 21:08
本帖最后由 熊猫拍板砖 于 2023-8-18 22:41 编辑

思路一:递归,最简单,解决难点是n过大,用全局数组或者map来维护一个已经查询过的 斐波那契数列
思路二:遍历,顺序的遍历下去也是可以的


跑了一下你的代码,你把 e==5 改成 e%5==0
如果你e== 5,如果我输入超过10,那么你的斐波那契数列就只有两行

我的代码

#include "stdio.h"

int main(void) {
    int n, f1 = 0, f2 = 1, f3 = 0,i=1;
    printf("输入需要的位数:");
    scanf("%d", &n);

    if (n>0 && n<=30)
    {
        printf("%10d",f1);
        i++;
        if (n>=2)
        {
            printf("%10d",f2);
            i++;
        }
        for(;i<=n;i++)
        {
            f3=f1+f2;
            f1=f2;
            f2=f3;
            if (i%5==0)
                printf("%10d\n",f2);
            else
                printf("%10d",f3);
        }
    }

    return 0;
}
#include "iostream"
#include "iomanip"

using namespace std;
int main() {
    int n, f1 = 0, f2 = 1, f3 = 0,i=1;
    cout<<"输入需要的位数:";
    cin>>n;

    if (n>0 && n<=30)
    {
        cout<<setw(10)<<f1;
        i++;
        if (n>=2)
        {
            cout<<setw(10)<<f2;
            i++;
        }
        for(;i<=n;i++)
        {
            f3=f1+f2;
            f1=f2;
            f2=f3;
            (i%5==0)?(cout<<setw(10)<<f2<<endl):(cout<<setw(10)<<f3);
        }
    }
    return 0;
}
JemmyloveJenny 发表于 2023-8-18 21:34
本帖最后由 JemmyloveJenny 于 2023-8-18 21:38 编辑

如归是改你的代码,第20行if(e==5)改成if(e%5 == 0)应该就可以了
其他的逻辑我没细看,不太能看懂。

如果是我写的话,我是这样写
[C++] 纯文本查看 复制代码
#include <cstdio>

int main()
{
    int n;

    while (scanf("%d", &n) != EOF)
    {
        int arr[3] = {0, 1};

        for (int i = 0; i < n; ++i)
        {
            if (i && i % 5 == 0)
                putchar('\n');

            printf("%10d", arr[i % 3]);
            arr[(i + 2) % 3] = arr[i % 3] + arr[(i + 1) % 3];
        }
        putchar('\n');
    }
}


这种OJ上的代码倒是也没必要用c++的iostream,printf和scanf还是更快也更方便
flyingOnRice 发表于 2023-8-18 22:11
本帖最后由 flyingOnRice 于 2023-8-18 22:14 编辑

你e==5的时候才换行一次,这不是全程只换了一次行?

我个人更推荐去做做欧拉计划的题目,有趣,而且不讲究这些输出格式等清规戒律。


补充一下,你搞个在线的编译器或者本地安装个msys2啥的,把自己的代码本地跑一遍,能看到更多的输出信息。
 楼主| cdyangjian 发表于 2023-8-19 09:15
flyingOnRice 发表于 2023-8-18 22:11
你e==5的时候才换行一次,这不是全程只换了一次行?

我个人更推荐去做做欧拉计划的题目,有趣,而且不讲 ...

谢谢指教。
 楼主| cdyangjian 发表于 2023-8-19 09:17
JemmyloveJenny 发表于 2023-8-18 21:34
如归是改你的代码,第20行if(e==5)改成if(e%5 == 0)应该就可以了
其他的逻辑我没细看,不太能看懂。

收到,谢谢指教。
 楼主| cdyangjian 发表于 2023-8-19 09:18
熊猫拍板砖 发表于 2023-8-18 21:08
思路一:递归,最简单,解决难点是n过大,用全局数组或者map来维护一个已经查询过的 斐波那契数列
思路二 ...

谢谢你的耐心指教。
wuaidh 发表于 2023-8-19 12:38
好高深啊
Cool_Breeze 发表于 2023-8-25 19:51
我也搞一个。
[C++] 纯文本查看 复制代码
int fibo(int i){
    
    static int a[2] = {0,1};
    if (i == 1) return *a;
    if (i == 2) return *(a+1);
    int b=*a + *(a+1);
    *a = *(a+1);
    *(a+1) = b;
    return b ;
}
void TestTest(){
    
    int a,i;
    
    cin >> a;
    
    for (i=1; i<a+1; ++i){
        cout << fibo(i) << " ";
        if (i%5 == 0) cout << endl;
    }
}
MoreWindows123 发表于 2023-9-13 12:36
可以看一看setw
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表