通过面积求周长......

Description

There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this paper.

Input

In the first line, there is an integer T indicates the number of test cases. In the next T lines, there is only one integer n in every line, indicates the area of paper.  $T\leq 10,n\leq {10}^{9}$

Output

For each case, output a integer, indicates the answer.

Sample Input

3 2 7 12

Sample Output

6 16 14

题目意思:告诉你一个矩形的面积求他的最小周长

解题思路:可以想到的方法最直接的就是枚举然后比较,可惜的是,这样会超时.......

然后就是一种更加快的方法。可以想想,当x和y之间的差越小,周长就越小。所以可以用开平方来节省时间。先把面积开平方,开完之后转成整形,然后计算面积是否可以整除开出来的数,不可以就减一,直到满足整除.....这样就找到了,最小周长的一条边,然后就可以输出最小周长了。

为什么说找到的就是最小周长的一条边呢?

可以这样比喻,当你开平方就是数的找到中点,然后向左走,找到的第一个满足整除的就是x和y之间距离最短的一对

先来一个超时的代码吧。     (好对比一下)

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int T;
 6     scanf("%d",&T);
 7     while(T--)
 8     {
 9         int S,sum=10000,k=0;
10         scanf("%d",&S);
11         for(int x=1; x<=S; x++)
12         {
13             if(S%x==0&&sum>=(x+S/x))
14                 sum=x+S/x;
15         }
16         printf("%d\n",2*sum);
17     }
18     return 0;
19 }

接下来是不超时的代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 int main()
 4 {
 5     int t,s,n;
 6     scanf("%d",&t);
 7     while(t--)
 8     {
 9         scanf("%d",&s);
10         n=(int)sqrt((double) s);
11         while(s%n)
12            {
13                //printf("%d\n",n);
14                 n--;
15            }
16         n=2*(n+s/n);
17     printf("%d\n",n);
18     }
19 return 0;
20 }
时间: 2024-10-14 17:54:40

通过面积求周长......的相关文章

已知面积求周长

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this pap

使用多态求矩形的面积和周长以及圆形的面积和周长

//使用多态求矩形的面积和周长以及圆形的面积我周长 Shape shape = new Circle(5); //new Square(5,6); double area = shape.GetArea(); double perimeter = shape.GetPerimeter(); Console.WriteLine(" 这个形状的面积是{0},周长是{1}",area,perimeter); Console.ReadKey(); } public abstract class

定义一个长方形类,定义 求周长和面积的方法实例

/* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: import必须出现在所有的class前面.*/ import java.util.Scanner; class ChangFangXing { //长方形的长 private int length; //长方形的宽 private int width; public ChangFangXing(){} //

c语言:任给三条边长,判断能否构成三角形,如果能,求出其面积和周长

任给三条边长,判断能否构成三角形,如果能,求出其面积和周长 程序: #include<stdio.h> #include<math.h> int main() { double a, b, c, d, s, area; printf("请输入三个正数:"); scanf("%lf%lf%lf",&a,&b,&c); if ((a + b > c) && (a + c > b) &&a

已知矩形面积求最小周长

Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this paper. Input In the first line, there is an integer T indicates the number of te

多个矩形,求覆盖面积,周长,及交点

问题:给出若干个矩形,(给的是矩形左上角和右下角坐标),求最后所得图形的面积/周长: 三个矩形如左图所示,而若要计算面积,看右图,用3个矩形各自的面积之和减去重复部分(红色和蓝色)的面积 人算很简单,但是用算法怎么实现呢? 此类问题一般都是用线段树辅助扫描法来计算: 什么是扫描法?有什么用?怎么用? 可以想象成一根假想的线,将图从左往右或从右往左或自下而上或自上而下“扫描”一遍,至于扫描的是什么则根据具体应用选择. 扫描线可以计算矩形面积.周长,可以计算线段交点,可以实现多边形扫描转换,在图的处

用面向对象多态的思想分别去求圆形和长方形的面积和周长

//用面向对象多态的思想分别去求圆形和长方形的面积和周长 static void Main(string[] args) { Sharp sharp = new Circle(5); double area=sharp.GetArea(); double perimeter= sharp.Getperimeter(); Console.WriteLine("面积是{0},周长是{1}",area,perimeter); Console.ReadKey(); } public abstr

c++-面向对象类的示例-求周长面积,判断体积相等-文件操作和一般操作

面向对象编程示例:求周长和面积 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //圆的周长 double getCircleGirth(double r) { return 2 * 3.14*r; } //源的面积 double getCircleArea(double r) { return 3.14*r*r; } //用面向对象实现 //圆类 class Circle { public: v

编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public double getZhouchang() { return zhouchang; } public void setZhouchang(double zhouchang) { this.zhouchang = zhouchang; } public double getMianji() { re