
不定期会出周赛题解ovo
作者:爱吃大芒果
个人主页 爱吃大芒果
本文所属专栏 从0到1自学c++
更多专栏
从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的是从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的是...
咦我们的角度看来,他属于是无限递归
现在想请你计算下面这个程序 递归nnn层之后ansansans等于多少(ansansans是全局变量)
C版(java版)
void dfs(int cnt){//cnt从1开始 如同dfs(1)
for(int i=1;i<=cnt;i++)ans++;
dfs(cnt+2);
}python版
def dfs(cnt):
for i in range(1,cnt+1):
ans++;
dfs(cnt+2)
同上 从dfs(1)进入输入一个数 输出一个整数从 dfs(1) 开始,递归深度 n 是指递归调用的次数(包括第一次调用),每层递归的 cnt 是 1, 3, 5, 7, …(每次加 2),每层循环次数等于 cnt
设递归深度为 n,那么依次的 cnt 为:
cnt1=1,cnt2=3,cnt3=5,…,cntk=2k−1
所以第 k 层循环次数为 2k−1,对 ans 的贡献就是 2k−1。
递归 nn 层后,总增量是:

化简得

所以程序只需要读入 n,输出

即可。
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n;//使用long long防止溢出
cin>>n;
cout<<n*n<<endl;
return 0;
}输出双层金字塔。
多个测试数据。每个测试数据输入一个整数n( 2 <= n <= 9)输出双层金字塔输入
2
5输出
*
***
*
*
***
*****
*******
*********
*******
*****
***
*对于输入的 n:
#include <bits/stdc++.h>
using namespace std;
void fct(int n){
for(int i=1;i<=n;i++){//打印上层金字塔
for(int j=1;j<=n-i;j++){
cout<<" ";//打印空格
}
for(int k=1;k<=2*i-1;k++){
cout<<"*";//打印”*“
}
cout<<endl;
}
for(int i=n-1;i>=1;i--){//打印下层金字塔层数为n-1
for(int j=1;j<=n-i;j++){
cout<<" ";//打印空格
}
for(int k=1;k<=2*i-1;k++){
cout<<"*";//打印”*“
}
cout<<endl;
}
}
int main(){
int n;
while(cin>>n){
fct(n);//函数类型为void所以输出不用cout
}
return 0;
}KiKi想知道从键盘输入的两个数的大小关系,请编程实现。
题目有多组输入数据,每一行输入两个整数(范围~),用空格分隔。针对每行输入,输出两个整数及其大小关系,数字和关系运算符之间没有空格,详见输入输出样例。直接读入两个整数比较即可,但是要注意输出">""<""="符号
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
while (cin >> a >> b) {
if (a == b) cout << a << "=" << b << endl;
else if (a > b) cout << a << ">" << b << endl;
else cout << a << "<" << b << endl;
}
return 0;
}输入一个人的出生日期(包括年月日),将该生日中的年、月、日分别输出。
数据范围:年份满足 1990≤y≤2015 1990 \le y \le 2015 \ 1990≤y≤2015 ,月份满足 1≤m≤12 1 \le m \le 12 \ 1≤m≤12 ,日满足 1≤d≤30 1 \le d \le 30 \ 1≤d≤30
输入只有一行,出生日期,包括年月日,年月日之间的数字没有分隔符。三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0。用 scanf 按宽度读入,printf 补 0 输出。
#include <bits/stdc++.h>
using namespace std;
int main() {
int y, m, d;
scanf("%4d%2d%2d", &y, &m, &d);
printf("year=%d\n", y);
printf("month=%02d\n", m);
printf("date=%02d\n", d);
return 0;
}DD给了dddddd一个由小写英文字母组成的字符串,但是dddddd觉得这个串太丑,dddddd觉得一个优美的字符串应该满足任意相邻字符都不相等,她想知道把给定字符串变成一个优美的字符串最少需要插入多少个字符,你只要告诉她,插入最少字符后的串的长度
第一行一个数T(1≤T≤10)
接下来T行,每行一个有且仅有小写英文字母构成的字符串s(1≤|s|≤100000)输出T行,每行一个数,表示美化后串的最短长度遍历字符串,如果 s[i] == s[i-1],说明这里需要插入一个字符,结果长度 +1
初始长度为原长,每遇到一次相邻相同,最终长度 +1
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){//多组输入
string s;
cin>>s;
int result = s.length();//读取字符串长度
for (int i = 1; i < s.length(); i++) {
if (s[i] == s[i-1]) {//判断相邻两个字符是否相同
result++; //如果相同则字符串长度+1
}
}
cout << result << endl;
}
return 0;
}给定两个正整数a,b,求a,b的最小公倍数。(即[a,b])
两个整整数,a,b一个正整数,表示[a,b]
对于输入输出的所有数据,保证不超过unsigned long long(18446744073709551615)
#include <iostream>
using namespace std;
//题目要求使用unsigned long long
unsigned long long gcd(unsigned long long a, unsigned long long b) {
return b == 0 ? a : gcd(b, a % b);
//等价于if (b == 0) {
//return a;
//} else {
// return gcd(b, a % b);
//}
}
int main() {
unsigned long long a, b;
cin >> a >> b;
unsigned long long g = gcd(a, b);
cout << (a / g * b) << endl;
return 0;
}