算法总结----day one

处理输入输出

  1. 不知道有几组数据
int n;
while(scanf("%d",&n)!=EOF)
{
	//EOF的值是-1,而不是0
	//end of file读到文件结尾自动结束
}
  1. 读到-1 -1就结束
int a,b;
while(scanf("%d %d",&a,&b)==2)
{
	if(a==-1 && b==-1) break;
}
  1. 给定几组数据. ---- 简单,本来就会
int n;
scanf("%d",&n);
while(n--)
{
	//n后面还要使用就用for循环.
}

快速幂

  • 算法思想
    二分思想,所以时间复杂度 O ( log ⁡ 2 n ) O(\log_2n) O(log2n)
    3 10 = 9 5 = 9 ∗ 9 4 = 9 ∗ 8 1 2 a n s = 1 , a = 3 , b = 10 → a = 9 , b = 5 → a n s = 9 , a = 81 , b = 2 → a = 81 ∗ 81 , b = 1 → a n s = 9 ∗ 81 ∗ 81 , a = a ∗ a , b = 0 3^{10}=9^5=9*9^4=9*81^2\\ ans = 1, a=3, b=10 \to a=9,b=5 \to ans = 9, a=81, b = 2 \to a=81*81, b=1\to ans = 9*81*81,a=a*a,b=0 310=95=994=9812ans=1,a=3,b=10a=9,b=5ans=9,a=81,b=2a=8181,b=1ans=98181,a=aa,b=0
int FastPow(int a,int b)\\计算a的b次方
{
	int ans = 1;
	while(b)
	{
		if(b & 1) ans=ans*a;// b & 1 的意思是 判断b是否是奇数
		a=a*a;
		b >>= 1;//相当于 b=b/2
	}
	return ans;
}
  • 例题
    在这里插入图片描述
#include <iostream>
using namespace std;
#define ll long long

ll pow(ll a, ll b)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans = ans * a % 1000;
        a = (a % 1000) * (a % 1000) % 1000;
        b >>= 1;
    }
    return ans;
}

int main()
{
    ll a, b;
    while (scanf("%lld %lld", &a, &b) == 2)
    {
        if (a == 0 && b == 0)
            break;
        printf("%lld\n", pow(a, b));
    }
    return 0;
}

辗转相除法

  • 算法思想
    70 和 21 : 70 = 21 ∗ 3 + 7 − − 如果有一个数 , 能同时整除 21 和 7 , 那么他一定能整除 70 于是问题就转化成了找 21 和 7 的最大公约数 70和21:70=21*3+7--如果有一个数,能同时整除21和7,那么他一定能整除70\\ 于是问题就转化成了找21和7的最大公约数 7021:70=213+7如果有一个数,能同时整除217,那么他一定能整除70于是问题就转化成了找217的最大公约数
    注意,算法名称叫辗转相除法,gcd是greatest common devisor,lcm是least common multiple
  • 代码
int gcd(int a,int b)
{
	if(b == 0) return a;
	return gcd(b,a%b);
}
  • 最小公倍数
    a ∗ b g c d ( a , b ) \frac{a*b}{gcd(a,b)} gcd(a,b)ab
  • 例题
    在这里插入图片描述
#include<iostream>
using namespace std;

int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int c;
        scanf("%d",&c);
        int a,b;
        scanf("%d %d",&a,&b);
        int ans = a/gcd(a,b)*b;
        for(int i=2;i<c;i++)
        {
            int num;
            scanf("%d",&num);
            ans = num/gcd(ans,num)*ans;
        }
        printf("%d\n",ans);
    }
    system("pause");
    return 0 ;
}

处理四舍五入

  • 处理
double ans = 31.500689;
//保留小数点后三位
ans *= 1000;//ans = 31500.689
ans = (int)(ans+0.5);//ans = 31501.189 -> 31501
ans /= 1000;//ans = 31.501

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值