入门训练(Java、C、C++)

这篇博客介绍了四个编程挑战,涉及整数加法、序列求和、圆的面积计算和斐波那契数列。题目强调了在不同数据规模下优化算法的重要性,如使用长整型避免溢出,以及在计算斐波那契数列时直接计算余数以提高效率。还提醒了在处理大数和浮点数时要关注精度和取值范围,并提供了多种编程语言的示例代码。
摘要由CSDN通过智能技术生成

1、A+B问题

问题描述
输入A、B,输出A+B。

输入格式
输入的第一行包括两个整数,由空格分隔,分别表示A、B。

输出格式
输出一行,包括一个整数,表示A+B的值。

样例输入
12 45
样例输出
57

数据规模与约定
-10000 <= A, B <= 10000。

这个范围对于解题非常重要,不同的数据范围会导致试题需要使用不同的解法来解决。比如本题中给的A、B范围不大,可以使用整型(int)来保存,如果范围更大,超过int的范围,则要考虑其他方法来保存大数。

有一些范围在方便的时候是在“问题描述”中直接给的,所以在做题时不仅要看这个范围,还要注意问题描述

C++:

#include <iostream>
using namespace std;
 
int main()
{
    int a, b;
    cin >> a >> b;
    cout << a + b;
    return 0;
}

C:

#include <stdio.h>
     
int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%d", a+b);
    return 0;
}

Java:

import java.util.Scanner;
 
public class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        Integer a = sc.nextInt();
        Integer b = sc.nextInt();
        System.out.println(a + b);
    }
}

2、序列求和

问题描述
求1+2+3+…+n的值。

输入格式
输入包括一个整数n。

输出格式
输出一行,包括一个整数,表示1+2+3+…+n的值。

样例输入1
4
样例输出1
10

样例输入2
100
样例输出2
5050

数据规模与约定
1 <= n <= 1,000,000,000。

本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。

本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。

如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。

Java:

import java.util.Scanner;

public class Main 
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in); 
		Long n = sc.nextLong();
		Long sum = (long) 0;
		if(n>=1 && n<=1000000000)
		{
			sum = (1+n)*n/2;
			System.out.println(sum);
		}
		sc.close();
	}
}

3、圆的面积

问题描述
给定圆的半径r,求圆的面积。

输入格式
输入包含一个整数r,表示圆的半径。

输出格式
输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入
4
样例输出
50.2654825

数据规模与约定
1 <= r <= 10000。

提示
本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。

import java.util.Scanner;

public class Main 
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in); 
		Integer r = sc.nextInt();
		Double PI = Math.PI;
		System.out.printf("%.7f",PI*r*r);
	}
}

4、Fibonacci数列

问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。

输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55

样例输入
22
样例输出
7704

数据规模与约定
1 <= n <= 1,000,000。

刘汝佳老师《算法竞赛入门经典》提到:要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变。

import java.util.Scanner;

public class Main 
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in); 
		int n = sc.nextInt();
		int[] a = new int[1000000];
		a[0] = 0;
		a[1] = 1;
		a[2] = 1;
		for(int i=3; i<=n; i++) {
			a[i] = (a[i-1] + a[i-2]) % 10007; // !
		}
		System.out.print(a[n]);
		sc.close();
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值