重点题
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;
}