1001 上下金字塔
题意:输入两个数,输出两个数的字符金字塔,如样例。
分析:通过观察可以看出,金字塔高度为2n-1行,其中上下对称,每一行先输入空格再输入星号,其中空格的数量是n-i,星号的数量是2i-1,后半金字塔反过来,注意中间最长的一行只输出一遍。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
for(int i=1;i<=(2*n-1)/2+1;i++)
{
for(int j=0;j<n-i;j++)
cout << " ";
for(int j=0;j<2*i-1;j++)
cout << "*";
cout << endl;
}
for(int i=(2*n-1)/2;i>=1;i--)
{
for(int j=0;j<n-i;j++)
cout << " ";
for(int j=0;j<2*i-1;j++)
cout << "*";
cout << endl;
}
}
return 0;
}
1002 数字三角形
题意:从1开始依次输出,第i行输出i个数。
分析:使用两个循环即可,注意输出格式。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int k = 1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
printf("%4d",k++);
}
cout << endl;
}
return 0;
}
1003 字符金字塔
题意:输出字母金字塔。
分析:字符金字塔和第1001题类似,不过这个是输出字符,而且字符的字母还有变化,可以使用char类型输出。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c;
cin >> c;
int a = c-'A'+1;
for(int i=1;i<=a;i++)
{
for(int j=0;j<a-i;j++)
cout << " ";
for(int j=0;j<(2*i-1)/2+1;j++)
printf("%c",'A'+j);
for(int j=(2*i-1)/2-1;j>=0;j--)
printf("%c",'A'+j);
cout << endl;
}
return 0;
}
1004 涂小天与他的画
题意:输入t个数据,输出t组菱形。
分析:和1001题类似。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
int n;
while(t--)
{
cin >> n;
for(int i=1;i<=n/2+1;i++)
{
for(int j=0;j<n/2-i+1;j++)
cout << " ";
for(int j=0;j<2*i-1;j++)
cout << "*";
cout << endl;
}
for(int i=n/2;i>=1;i--)
{
for(int j=0;j<n/2-i+1;j++)
cout << " ";
for(int j=0;j<2*i-1;j++)
cout << "*";
cout << endl;
}
}
return 0;
}
1005 箭形图案
题意:输出星号组成的箭型图案。
分析:观察输出了n+1行字符,上下对称。每一行的空格为2*(n-i),字符个数为i,下面对称相反,中间一行特殊,没有空格,输出n+1个星号。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
for(int i=1;i<=n+1;i++)
{
for(int j=2*n-2*(i-1);j>0;j--)
cout << " ";
for(int j=0;j<i;j++)
cout << "*";
cout << endl;
}
for(int i=n;i>=1;i--)
{
for(int j=2*n-2*(i-1);j>0;j--)
cout << " ";
for(int j=0;j<i;j++)
cout << "*";
cout << endl;
}
}
return 0;
}
1006 牛牛学数列
题意:计算数列1-2+3-4+5…+n的值。
分析:循环结构,偶数位加负号,计数累加即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int ans = 0;
for(int i=1;i<=n;i++)
{
int num = i;
if(i%2==0)
num = -num;
ans += num;
}
cout << ans;
return 0;
}
1007 牛牛学数列2
题意:计算数列1+1/2+1/3+…+1/N。
分析:浮点数类型累加即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double sum=0.;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
sum+=1./i;
}
printf("%.6f",sum);
return 0;
}
1008 牛牛学数列3
题意:计算数列1+1/(1-3)+1/(1-3+5)+…+1/(1-3+5-…((-1)^(n-1))*(2n-1))的值。
分析:取flag处理正负,i每次加2,出1 3 5 7奇数。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
double ans = 0.;
double f;
int flag = 1;
for(int i=1;i<=2*n-1;i+=2)
{
f += i*flag;
ans += 1.0/ f;
flag = -flag;
}
printf("%.3f", ans);
return 0;
}
1009 牛牛学数列4
题意:计算数列1+(1+2)+(1+2+3)+…+(1+2+3+…+n)
分析:这个数列中有n-i+1个i,循环一遍计算累加即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int ans = 0;
for(int i=1;i<=n;i++)
{
ans = ans + (n-i+1)*i;
}
cout << ans;
return 0;
}
1010 牛牛学数列5
题意:求46位斐波那契数列。
分析:根据每一项等于前面两项的和的规则递归即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int f[47];
f[1] = 1;
f[2] = 1;
for(int i=3;i<=46;i++)
f[i] = f[i-1] + f[i-2];
int n;
cin >> n;
cout << f[n];
return 0;
}
1011 牛牛学数列6
题意:根据给出的规则f[i] = f[i-3]+2*f[i-2]+f[i-1],求数列前20项。
分析:递推循环即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int f[30];
f[1] = 0;
f[2] = 1;
f[3] = 1;
for(int i=4;i<=20;i++)
f[i] = f[i-3]+2*f[i-2]+f[i-1];
int n;
cin >> n;
cout << f[n];
return 0;
}
1012 A+B
题意:计算输出多组a+b。
分析:直接输入输出即可,注意多组数据的处理。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
while(cin >> a >> b)
{
cout << a + b << endl;
}
return 0;
}
1013 多组输入a+b
题意:计算输出多组a+b。
分析:直接输入输出即可,注意多组数据的处理。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
while(cin >> a >> b)
{
cout << a + b << endl;
}
return 0;
}
1014 多组输入a+b II
题意:输入组数t,输出t组a+b。
分析:处理多组数据的方式有所变化。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
1015 多组数据a+b III
题意:多组数据计算和a+b,a和b都等于0的时候结束。
分析:处理多组数据的方式有所变化,特判加break即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
while(cin >> a >> b)
{
if(a==0&&b==0)
break;
cout << a + b << endl;
}
return 0;
}
1016 [NOIP2018]标题统计
题意:统计字符串中多少个字符,即排除空格和换行符。
分析:循环计数即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin, s);
int k=0;
for(int i=0;i<s.length();i++)
{
if(s[i]==' '||s[i]=='\n')
k++;
}
cout << s.size()-k;
return 0;
}
1017 栗酱数数
题意:从1开始输数到n,碰到4的倍数和其中含4的数就跳过去,输出这些数。
分析:循环输出,判定4倍数和含有4的数。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool have4(int x)
{
while(x!=0)
{
if(x%10==4)
return 1;
x/=10;
}
return 0;
}
int main()
{
int n;
cin >> n;
int k=1;
while(n!=k)
{
if(k%4==0||have4(k))
{
k++;
continue;
}
cout << k++ << '\n';
}
if(n%4!=0)
cout << n << endl;
return 0;
}
1018 有趣的二进制
题意:统计一个数在64位二进制补码表示下,一共有多少个1。
分析:64位使用unsigned long long存储,循环统计1的个数即可。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
unsigned long long n;
while(cin >> n)
{
int ans=0;
while(n)
{
if(n%2==1) ans++;
n/=2;
}
cout << ans << endl;
}
return 0;
}
1019 [NOIP2006]数列
题意:求出k次方序列的第n项,数列规则已给出。
分析:位掩码的思想,每次进一位,如果此位上数值为1,就乘阶数。
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k, n;
cin >> k >> n;
long long ans = 0;
int f = 1;
while(n)
{
ans += (n%2)*f;
f *= k;
n /= 2;
}
cout << ans;
return 0;
}
1020 只能吃土豆的牛牛
题意:第i个土豆的重量为3*(i-1),问组合的第k大重量是多少。
分析:和上一题类似,位掩码的思想解决。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll solve(ll x)
{
ll ans = 0, t = 1;
while(x)
{
if(x&1) ans += t;
t *= 3;
x >>= 1;
}
return ans;
}
int main()
{
ll t, a;
cin >> t;
for(int i=1;i<=t;i++)
{
cin >> a;
printf("Case #%d: %lld\n", i, solve(a));
}
return 0;
}