1001 上下金字塔
题意:输入两个数,输出两个数的字符金字塔,如样例。
分析:通过观察可以看出,金字塔高度为2n-1行,其中上下对称,每一行先输入空格再输入星号,其中空格的数量是n-i,星号的数量是2i-1,后半金字塔反过来,注意中间最长的一行只输出一遍。
题解:
#include
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=1;i--){for(int j=0;j
1002 数字三角形
题意:从1开始依次输出,第i行输出i个数。
分析:使用两个循环即可,注意输出格式。
题解:
#include
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
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=0;j--)printf("%c",'A'+j);cout << endl;}return 0;
}
1004 涂小天与他的画
题意:输入t个数据,输出t组菱形。
分析:和1001题类似。
题解:
#include
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=1;i--){for(int j=0;j
1005 箭形图案
题意:输出星号组成的箭型图案。
分析:观察输出了n+1行字符,上下对称。每一行的空格为2*(n-i),字符个数为i,下面对称相反,中间一行特殊,没有空格,输出n+1个星号。
题解:
#include
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=1;i--){for(int j=2*n-2*(i-1);j>0;j--)cout << " ";for(int j=0;j
1006 牛牛学数列
题意:计算数列1-2+3-4+5…+n的值。
分析:循环结构,偶数位加负号,计数累加即可。
题解:
#include
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
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
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
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
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
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
using namespace std;
int main()
{int a, b;while(cin >> a >> b){cout << a + b << endl;}return 0;
}
1013 多组输入a+b
题意:计算输出多组a+b。
分析:直接输入输出即可,注意多组数据的处理。
题解:
#include
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
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
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
using namespace std;
int main()
{string s;getline(cin, s);int k=0;for(int i=0;iif(s[i]==' '||s[i]=='\n')k++;}cout << s.size()-k;return 0;
}
1017 栗酱数数
题意:从1开始输数到n,碰到4的倍数和其中含4的数就跳过去,输出这些数。
分析:循环输出,判定4倍数和含有4的数。
题解:
#include
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
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
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
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;
}