牛客竞赛语法入门班循环结构习题C++版本参考代码及部分解析

重点题
1001 上下金字塔
1002 数字三角形
1003 字符金字塔
1008 牛牛学数列3
1017 栗酱数数
1018 有趣的二进制
1019 [NOIP2006]数列
1024 买铅笔
1025 整数个数

1001 上下金字塔
画图题需要在纸上边画边编写代码,找出行数与各行对应空格和星号的数量之间的关系。

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;//n = 5
    
    for (int i = 1;i < n;i++)//前4行
    {
        for (int j = n - i;j >= 1;j--) cout << " ";//每行输出对应数量的空格
        for (int k = 1;k <= 2 * i - 1;k++) cout << "*";//每行输出对应数量的 * 
		cout << endl;//星号输完之后换行 
    }
    
    for (int i = 1;i <= 2 * n - 1;i++) cout << "*";//至此,上半个三角形输出完毕
    
	cout << endl;
	
	for (int i = n - 1;i >= 1;i--)//后4行
	{
		for (int j = n - i;j >= 1;j--) cout << " ";//每行输出对应的空格
		for (int k = 1;k <= 2 * i - 1;k++) cout << "*";//每行输出对应数量的 * 
		cout << endl; 
	}//至此,下半个三角形输出完毕
	
	return 0;
}

1006 牛牛学数列

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 1;i <= n;i++)
    {
        if (i % 2) ans += i;//i是奇数,相加
        else ans -= i;//i是偶数,相减
    }
    cout << ans;
    return 0;
}

1007 牛牛学数列2

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    double ans = 0;
    for (int i = 1;i <= n;i++) ans += 1.0 / i;
    printf("%.6f",ans);
    return 0;
}

1008 牛牛学数列3

不难发现:
1 = 1;
1 - 3 = -2;
1 - 3 + 5 = 3;
1 - 3 + 5 - 7 = -4
1 - 3 + 5 - 7 + 9 = 5… …
故原式等于1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + … …(分母为奇数则相加,分母为偶数则相减)

#include <iostream>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    double ans = 0;
    for (int i = 1;i <= n;i++)
    {
        if (i % 2) ans += 1.0 / i;
        else ans -= 1.0 / i;
    }
    printf("%.3f",ans);
    return 0;
}

1009 牛牛学数列4
打表:将1存在res[1],将1+2的值存在res[2],将1+2+3的值存在res[3]… … 最后求和即可

#include <iostream>
using namespace std;
int res[1010];//打表
int main()
{
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 1;i <= n;i++)
        for (int j = 1;j <= i;j++)
            res[i] += j;
    for (int i = 1;i <= n;i++) ans += res[i];
    cout << ans;
    return 0;
}

1010 牛牛学数列5

n的取值范围很小,可以递归实现

#include <iostream>
using namespace std;
int fibonacci(int n)
{
    if (n == 1 || n == 2) return 1;
    else return fibonacci(n - 1) + fibonacci(n - 2);
}

int main()
{
    int n;
    cin >> n;
    cout << fibonacci(n);
    return 0;
}

1011 牛牛学数列6

#include <iostream>
using namespace std;
int ans[25];//打表
int main()
{
    int n;
    cin >> n;
    ans[1] = 0;
    ans[2] = 1;
    ans[3] = 1;
    for (int i = 4;i <= n;i++)
        ans[i] = ans[i - 3] + 2 * ans[i - 2] + ans[i - 1];
    cout << ans[n];
    return 0;
}

1012 A+B

#include <iostream>
using namespace std;
int main()
{
    int a,b;
    while (cin >> a >> b) cout << a + b << endl;
    return 0;
}

1013 多组输入a+b 与上题代码相同

1014 多组输入a+b II

#include <iostream>
using namespace std;
int main()
{
    int n;
    int a,b;
    cin >> n;
    while (n--)
    {
        cin >> a >> b;
        cout << a + b << endl;
    }
    return 0;
}

1015 多组数据a+b III

#include <iostream>
using namespace std;
int main()
{
    int a,b;
    while (cin >> a >> b,a,b) cout << a + b << endl;
    return 0;
}

1016 [NOIP2018]标题统计

#include <iostream>
using namespace std;
int main()
{
    char c;
    int cnt = 0;
    while (scanf("%c",&c) != EOF)
        if (c != ' ' && c != '\n')
            cnt ++;
    cout << cnt;
    return 0;
}

1017 栗酱数数

#include <iostream>
using namespace std;

bool is_include_four(int n)
{
    int flag = 0;
    while (n > 0)
    {
        //取出各个位置上的数字判断是否存在4
        int ans = n % 10;
        n /= 10;
        if (ans == 4) flag = 1; 
    }
    return flag;
}

int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++)
    {
        //不是4的倍数且不包含数字4,则输出
        if (i % 4 != 0 && !is_include_four(i)) cout << i << endl;
        else continue;
    }
    return 0;
}

1018 有趣的二进制(早已忘记啥是补码)

1019 [NOIP2006]数列

1023 绩点

#include <iostream>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    double gpa,ans = 0;
    int sc,sum = 0;
    while (n--)
    {
        scanf("%lf %d",&gpa,&sc);
        ans += gpa * sc;
        sum += sc;
    }
    printf("%.1f\n",ans / sum);
    return 0; 
}

1024 买铅笔

本题采用结构体写法较为清楚

#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

const int N = 1010;

struct Node//Node表示结构体
{
    double cnt;//cnt表示包装内铅笔的数量
    int price;//price表示这种包装的价格
    int cost;//表示使用这种包装所需要的花费
}node[N];//node表示结构体数组

bool cmp(Node a,Node b)
{
    return a.cost <= b.cost;//按照cost从小到大排序
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0;i < 3;i++) 
    {
        cin >> node[i].cnt >> node[i].price;
        node[i].cost = ceil(1.0 * n / node[i].cnt) * node[i].price;//向上取整得到花费(保证小数才可以向上取整)
    }
    sort(node,node + 3,cmp);//排序
    cout << node[0].cost;
    return 0;
}

1025 整数个数

类似桶排序

#include <iostream>
using namespace std;

const int N = 55;
int a[N];

int main()
{
    int k,x;
    cin >> k;
    while (k--)
    {
        cin >> x;
        a[x]++;
    }
    cout << a[1] << " " << a[5] << " " << a[10];
    return 0;
}

1049 3和5和7

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++)
        if (i % 3 == 2 && i % 5 == 3 && i % 7 == 2)
            cout << i << endl;
    return 0;
}

1051 数位之和

#include <iostream>
using namespace std;;
int main()
{
    int n;
    cin >> n;
    int sum = 0;
    while (n > 0)
    {
        sum += (n % 10);//每次取出最后一位
        n /= 10;
    }
    cout << sum;
    return 0;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值