P7772 [COCI 2009/2010 #2] FAKTOR

记录12

#include <bits/stdc++.h>
using namespace std;
int main() {
	int a,i,t=0,j=1;
	cin>>a>>i;
	for(j=1;;j++){
		t=0;
		if(j%a) t=1;
		if((j/a+t)>=i) break;
	}
	cout<<j;
    return 0;
}



突破点

给定 A,I,求一个最小的 N,使得⌈N​/A⌉≥I。👉向上取整

思路

数据不大,暴力枚举,注意向上取整就行了

代码简析

for(j=1;;j++){
		t=0;
		if(j%a) t=1;
		if((j/a+t)>=i) break;
	}

t=0;每次循环,将t设置为0,代表N/A刚好就是I

j=1从1开始枚举,中间没设置终止条件,找到后break就行了

if(j%a) t=1;因为是向上取整,所以有余数(几点几)就要加一

if((j/a+t)>=i) break;N/A后再加上t,t就是看N/A的实际值是整数(t=0)还是小数(t=1)

补充

更快的一种写法

向上取整,要求数字最小,那么最好就是题目中的I−1 点几,所以直接尝试A×(I−1),但是这会得到的是I−1,为了向上取整得到 I ,所以还要再加 1

熟悉数学上的取整后,有一种更简单的数学表达

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,i;
    cin>>a>>i;
    int n=a*(i-1)+1;
    cout<<n;
	return 0;
}

再补充

在C++中,可以使用标准库中的 std::ceilstd::floor 函数来实现向上取整和向下取整。这些函数定义在 <cmath> 头文件中。如果不使用标准库函数,也可以手动实现这些功能。

使用标准库函数

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double num;

    cout << "Enter a number: ";
    cin >> num;

    cout << "Ceil: " << ceil(num) << endl;  // 向上取整
    cout << "Floor: " << floor(num) << endl; // 向下取整

    return 0;
}

手动实现向上取整和向下取整

如果你不想使用标准库函数,可以手动实现这些功能。以下是手动实现的代码:

向下取整

#include <iostream>
using namespace std;

int main() {
    double num;

    cout << "Enter a number: ";
    cin >> num;

    int floorValue = static_cast<int>(num); // 向下取整
    if (num < 0 && num != floorValue) {
        floorValue--;
    }

    cout << "Floor: " << floorValue << endl;

    return 0;
}
向上取整

#include <iostream>
using namespace std;

int main() {
    double num;

    cout << "Enter a number: ";
    cin >> num;

    int ceilValue = static_cast<int>(num); // 向下取整
    if (num > 0 && num != ceilValue) {
        ceilValue++;
    }

    cout << "Ceil: " << ceilValue << endl;

    return 0;
}

详细解释

向下取整
  • 向下取整:将一个浮点数向下取整到最接近的整数。

  • 实现:使用 static_cast<int>(num) 将浮点数转换为整数,这会自动向下取整。

  • 特殊情况:如果输入的数是负数且不是整数,需要再减1。

向上取整
  • 向上取整:将一个浮点数向上取整到最接近的整数。

  • 实现:使用 static_cast<int>(num) 将浮点数转换为整数,这会自动向下取整。如果输入的数是正数且不是整数,需要再加1。

示例输入和输出

输入:
Enter a number: 3.7
输出:

Ceil: 4
Floor: 3
输入:
Enter a number: -3.7
输出:

Ceil: -3
Floor: -4

总结

  • 使用标准库函数:使用 <cmath> 中的 std::ceilstd::floor 函数,这些函数已经经过优化,使用起来非常方便。

  • 手动实现:如果不使用标准库函数,可以手动实现向上取整和向下取整的功能。手动实现需要考虑正数和负数的不同情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值