2015-09-24 2 views
0

Я делаю программу для вычисления числа идеальных квадратов между 1 и другим числом, и я хочу, чтобы счетчик принимал только первое число целого числа и положил 0 на остальное, например: Результат вычисления 31, я хочу отобразить 30, если это 190, затем отобразить 100 и так далее.Завершение целого числа, которое всегда заканчивается 0

int number; 
int i = 1; 
int perfectCounter = 0; 

printf("Enter a number: "); 
scanf("%d", &number); 

while (i <= number) { 
    float tempSquare = sqrt(i); 
    int integerPart = tempSquare; 

    if (tempSquare == integerPart) 
     perfectCounter++; 

    i++; 
} 

printf("%d", perfectCounter); 

Вот код, который я прямо сейчас, если я ввожу 1000, он будет отображать 31, и я хочу, чтобы отобразить 30, я не могу придумать решение для этого.

+0

Используйте логарифмы, чтобы узнать наивысшую мощность 10 в количестве. Разделите на эту мощность 10, получите целую часть этого и умножьте на мощность 10. – Barmar

+0

Это не алгебра средней школы, вам просто нужно перевести ее на аналогичные функции C. – Barmar

+1

'if (tempSquare == integerPart)' может выйти из строя из-за округления с плавающей запятой; было бы точнее проверить 'if (integerPart * integerPart == i)' –

ответ

2

Разделить число на самой высокой мощности 10 ниже номер. Сделайте это, используя целочисленную арифметику, чтобы получить целочисленную часть деления. Затем умножьте силой 10.

#include <math.h> 

int powerOf10 = pow(10, (int)log10(perfectCounter)); 
int roundedCounter = (perfectCounter/powerOf10)*powerOf10; 
printf("%d", roundedCounter); 
+0

Даже с современными математическими сопроцессорами целочисленная арифметика все еще намного быстрее, чем плавающая точка. – YePhIcK

+1

И что? Кого волнует, сколько времени потребуется, чтобы завершить окончательный результат. Мы не делаем этого внутри большой петли. – Barmar

+0

И люди жалуются, что современное программное обеспечение раздуто и медленно ;-) Однако у вас есть верная точка, что более короткий код легче читать. – YePhIcK

2

Вы можете использовать функцию, подобную этой, чтобы округлить ваши числа. В основном то, что она делает это «Урезает» одна цифра в то время, пока мы не оставили только одну цифру, а затем добавляет необходимое количество нулей к нему:

int round(int _in){ 
    int numDigits = 0; 
    while(_in > 9){ 
     ++numDigits; 
     _in /= 10; 
    } 
    int res = _in; // whatever is left would be the left-most digit 
    for(int i = 0; i < numDigits; ++i){ 
     res *= 10; 
    } 
    return res; 
} 
0

Вот простое решение, без математики:

void print_rounded(int i) { 
    unsigned u = i; 
    if (i < 0) { putchar('-'); u = -i; } 
    char buf[2]; 
    int n = snprintf(buf, 2, "%u", u); 
    for (putchar(buf[0]); --n; putchar('0')) {} 
} 

(Другими словами, напечатать первую цифру, а затем напечатать достаточно 0, чтобы компенсировать длину от исходного номера.)

Смежные вопросы