A.门牌制作
制作从1到2020这些数字里面需要使用后多少个字符2;
思路:
for循环,并且把数字拆分,从每一位去判断。
代码:
#include
using namespace std;
int solve(int n)
{
int ant=0;
while(n)//把数字拆分
{
int x=n%10;
if(x==2)ant++;
n/=10;
}return ant;
}
int main()
{
int sum=0;
for(int i=1;i<=2020;i++)
{
sum+=solve(i);
}cout<<sum<<endl;
}//答案624
B.即约分数
题意:
判断从1到2020中有多少个即约分数。
思路:
求最大公约数,gcd判断即可,符合条件就累加;
代码
#include
#define ll long long
using namespace std;
ll gcd(ll a,ll b)//求最大公约数
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int sum=0;
for(ll i=1;i<=2020;i++){
for(ll j=1;j<=2020;j++){
if(gcd(i,j)==1)//判断是否符合条件
sum++;}}
cout<<sum<<endl;
}
//答案2481215
C.蛇形填数
题意:
按照图片的走法,最后第20行第20列的数字为多少?
思路:
因为是道填空题,本人就直接找规律求解了(相信在座各位大佬肯定可以编程写出)。1,5,13,25…d1=4,d2=8,d3=12…dn=4*n;
代码
#include
using namespace std;
int main()
{
int sum,n;
while(cin>>n){
int d=1,sum=1;
for(int i=1;i<n;i++)
{
d=4*i;
sum+=d;
}cout<<sum<<endl;}
}//答案761
D.跑步锻炼
题意:
从2000.01.01周六到2020.10.01周四,这些时间内,如果是月初或者周一就跑2千米,其他时间跑1千米。
代码
#include
using namespace std;
int main()
{
int year=2000,month=1,day=1,week=6,sum=0;
int a[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
while(year!=2020||month!=10||day!=1)
{
if((year%400==0)||(year%4==0&&year%100!=0))//判断闰年
{
a[2]=29;}
else {
a[2]=28;}day++;//天数累加
week=(week+1)%7;//weak==0代表星期天
if(day>a[month])//判断天数是否大于当月的天数
{
day=1;
month++;
}
if(month>12)//判断是否超过12月
{
month=1;
year++;
}
if(day==1||week==1)//判断是否符合题意条件
{
sum++;//月初或者周一就多加一次
}
sum++;
}cout<<sum+2<<endl;//加上第一天与最后一天
}//答案8879
F.成绩统计
题意:
输入一些成绩,成绩大于60分则为及格,大于85分则为优秀,输出及格率与优秀率(答案需要四舍五入并且保留整数与百分号)
思路:
写两个if语句判断,并且累加,最后输出及格率与优秀率时,需要加上0.5,就可以有四舍五入的效果,(需要注意的就是输出需要四舍五入)。
代码
#include
using namespace std;
int main()
{
int n,x;
while(cin>>n)
{
float sum1=0,sum2=0;
for(int i=0;i<n;i++)
{
cin>>x;
if(x>=60)//判断及格
sum1++;
if(x>=85)//判断优秀
sum2++;
}
int a=float(sum1/n*100+0.5);//产生四舍五入的效果
int b=float(sum2/n*100+0.5);
cout<<a<<"%"<<endl;
cout<<b<<"%"<<endl;
}return 0;
}
输入一个日期,该日期为8位数字,需要输出下一个符合条件的回文日期与一个即为回文日期也是ABABBABA形式的回文日期。
思路:
将输入的日期进行进行自加,并且判断是否为闰年与日期是否为正确日期。判断结束后将日期进行拆分为8位数字,存入数组中,如果a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]满足回文,在满足回文的条件下如果**a[0]==a[2]&&a[1]==a[3]&&a[0]!=a[1]**满足ABABBABA形式的回文。具体请看代码。
代码
#include
using namespace std;
int d[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
bool runyears(int year)//判断是否为闰年
{
return year%400==0||(year%4==0&&year%100!=0);
}
bool date(int year,int month,int day)//判断日期是否正确
{
if(month>12)
{
return false ;
}
if(runyears(year)&&month==2)
{
return day<=29;
}return day<=d[month];
}
int main()
{
bool flag=false;
int n;
cin>>n;
for(int i=n+1;i<89991231;i++)
{
int a[8];
for(int j=7,m=i;j>=0;j--,m/=10)
{
a[j]=m%10;//将日期拆分
}
int year=a[0]*1000+a[1]*100+a[2]*10+a[3];
int month=a[4]*10+a[5];
int day=a[6]*10+a[7];
if(!date(year,month,day))//如果日期不正确,则跳过
{
continue;
}
//判断是否为回文
if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4])
{
if(flag==false)
{
cout<<i<<endl;
flag=true;
}
//判断是否为ABABBABA形式的回文
if(a[0]==a[2]&&a[1]==a[3]&&a[0]!=a[1])
{
cout<<i<<endl;
break;
}
}
}return 0;
}
输入一个字符串,按顺序不断拆分为不同的子字符串,并且计算每一个子字符串中不同字母的个数,并求和输出
思路:
使用容器set去重,使用substr函数按顺序截取子字符串。具体操作请看代码。
代码
#include
using namespace std;
int solve(string s)//容器会自动删去重复的字符
{
set<char>st;
for(int i=0;i<s.size();i++)
{
st.insert(s[i]);
}return st.size();//去重后的字符长度
}
int main()
{
int sum=0;
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
for(int j=i;j<s.size();j++)
{
string ss=s.substr(i,j-i+1);//字符截取
sum+=solve(ss);
}
}cout<<sum<<endl;
}
** 如果觉得博主写的还不错点个赞吧,比心!**