C编程练习012

题目

小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。例如:半径的平方如果为25优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。

输入描述与输出描述

输入为一个整数,即为圆半径的平方,范围在32位int范围内。 输出为一个整数,即为优雅的点的个数

示例输入与输出

输入25 输出12

代码

#include <stdio.h>
#include <math.h>

int main(void)
{
    int R, r, x, flag = 0, count = 0;

    printf("请输入圆半径的平方数:");
    scanf("%d",&R);
    r = (int)sqrt(R);    // 强制转化为整形
    /* 判断一个双精度浮点型数据的整数部分是否与其小数部分相等 */
    if (r == sqrt(R))   
    {
        flag = 1;    // 标记横、纵坐标有0的情况
        r -= 1;
    }
    for ( x = 1; x <= r; x++ )    //坐标没有0的情况:(+/-3, +/-4), (+/-4, +/-3)
    {
        double y = sqrt( R - x*x );
        int y1 = (int)y;
        if ( y1 == y )    
        {
            count++;
        }
    }
    count *= 4;
    if( 1 == flag )      //坐标有0的情况:(0, +/-5) (+/-5, 0)
    {
        count += 4;
    }    

    printf("半径的平方为%d的圆的优雅点的个数为:%d\n", R, count);

    return 0;
}

分析

(1)找出 (0, +/-5) (+/-5, 0)这种情况; (2)找出(+/-3, +/-4), (+/-4, +/-3)这种情况。

首先,判断半径平方的算术平方根是否等于其整数部分,如果等于,则存在 (0, +/-5) (+/-5, 0)这种情况,使用flag变量标记下来;对于(+/-3, +/-4), (+/-4, +/-3)这类情况使用勾股定理进行判断验证,以x为自变量,循环遍历至r-1,求逐一对应的y的值,同样判断其算术平方根是否等于其整数部分,如果等于,则存在(+/-3, +/-4), (+/-4, +/-3)这一类情况。最后,算出两类情况的优雅的点的总数。

运行结果

ZGAeij.png


我的微信公众号:嵌入式大杂烩

VcSFJJ.md.png


 上一篇
C编程练习013 C编程练习013
1、题目分享一道CVTE(广州视源电子科技股份有限公司)的面试笔试题: 世界上有两种人,一种懂二进制,一种不懂。那么你知道两个 int32 整数 m 和 n 的二进制表达,有多少个位(bit)不同么? 输入示例:1999 2299 输出示
2018-07-01
下一篇 
C编程练习011 C编程练习011
题目 一个10万以内的整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 代码方法一: #include <stdio.h> #include <math.h> int main(void
2018-06-14
  目录