程序设计初步ppt和训练题

本次的内容是依学校校队的安排,给学弟学妹们讲解程序设计初步的ppt,因为偏基础,只是讲的话效果不是很好,因此在VJ上挂了一套题,感兴趣的同学可以到VJ上自己做着玩。链接如下: https://vjudge.net/contest/355440

PPT的下载地址:https://download.csdn.net/download/zhiyeegao/12136528

PPT如下:

 

题解如下:(考虑到基础性问题,题解中最难就是循环,十分适合新手做)

A.	水仙花数

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
using namespace std;

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int t;
        if(n>m)
        {
            t=n;
            n=m;
            m=t;
        }
        int flag=0;
        for(int i=n;i<=m;i++)
        {
            int a=i/100;
            int b=i%10;
            int c=i/10%10;
            if(i==a*a*a+b*b*b+c*c*c)
            {
                if(flag==0)
                {
                    printf("%d",i);
                    flag=1;
                }
                else
                {
                    printf(" %d",i);
                }
            }
        }
        if(flag==0)
        printf("no");
        printf("\n");
    }
    return 0;
}

B.	A+B

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--){
		long long s,a,b;
		cin>>a>>b;
		s=a+b;
		s=s%100;
		cout<<s<<endl;
	}
 }

C.	偶数拆分

#include<stdio.h>
#include<math.h>
int is (int x)
{
	int i;
	if(x==2) return 1;
	for(i=2;i<=sqrt(x);i++)
		if(x%i==0)
			return 0;
	return 1;
}
int main()
{
	int i,n,m;
	while(1)
	{
		n=0;
		scanf("%d",&m);
		if(m==0) break;
		for(i=2;i<m-i;i++)
			if(is(i)&&is(m-i))
				n++;
		printf("%d\n",n);
	}
	return 0;
}
D.	牛生牛
//类似斐波拉契:old(第n-1月的牛数)+new(新生牛数,易知新生牛数量等于第n-3月牛数)
#include<iostream>
using namespace std;
int fibonacci1(int n)
{
    switch(n)
    {
        case 1:return 1;
        case 2:return 2;
        case 3:return 3;
        default:return fibonacci1(n-3)+fibonacci1(n-1);
    }
}
int main()
{
    int n;
    while(cin>>n&&n)
    {
        cout<<fibonacci1(n)<<endl;
    }
    return 0;
}
E.	一根绳上的蚂蚁

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int T,ans,sum,a,N,M;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&N,&M);
        ans=sum=0;
        while(M--)
        {
            scanf("%d",&a);
            ans=max(ans,max(a,N-a));
            sum=max(sum,min(a,N-a));
        }
        printf("%d %d\n",sum,ans);
    }
    return 0;
}

F.	魅力序列

#include<iostream> 
#include<string> 
#include<algorithm> 
using namespace std; 
int main(void) 
{ 
    long long n,m,e; 
    long long ans; 
    while (~scanf("%lld%lld",&n,&m)) 
    { 
        e=n-n%(2*m); 
        ans=(e)*(-m)/2;//所有完整段求和
        if(e+m<n)//分类讨论
        {
        	ans=ans+(2*e+1+m)*m/2;
        	ans=ans-(e+m+1+n)*(n-e-m)/2;
        }
        else if(e+m>n)
        {
        	ans=ans+(e+1+n)*(n-e)/2;
        }
        else
        {
        	ans=ans+(2*e+1+m)*m/2;
        }
    	printf("%lld\n",ans);//这题要用long long来储存答案
    } 
    return 0; 
}   

可以发现从1开始前2*m项的和的绝对值是一个常数即m,e=n-n%(2*m)那么只需处理后面e+1~n的数字即可。因此可以有如下规律

设剩下的区间为e+1~n(也可能是e+m)。

1、若e+m<=n——即数轴分布情况为e+1~e+m~n。只需将之前的所有完整段的和加上Sum[e+1,e+m]即可,且每一项都是正数。

2、若e+m>n——即数轴分布情况为e+1~n~e+m。那么要计算S1[e+1,n]与S2[n+1,e+m],ans=ans+S1-S2。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值