所以我被要求对数字的每一位进行平方,并将它们连接在一起,然后使用C作为数字返回.但由于某些原因,我在将0处理为数字并在我的算法中实现它时遇到了问题.例如:当n=3210987654时,预期为9410816449362516,但得到的是941816449362516.

#include<math.h>
unsigned long long square_digits(unsigned n) {
    unsigned long long result = 0;
    int k = 0;
    int digits = (int)log10(n) + 1;
    for (int d = 0; d < digits; d++) {
        int digit = n % 10;
        int squared = digit * digit;
        n /= 10;
        if (d == 0) {
            result += squared * pow(10, k);
        }
        else {
            if (digit == 0) {
                k++;
            } 
            else if (digit < 4) {
                k++;
                result += squared * pow(10, k);
            } 
            else {
                k += 2;
                result += squared * pow(10, k);
            }
        }
    }
    return result;
}

所以我试着做的是使用一个变量k,它的作用是10的幂,它的作用是根据连接一个平方数字所需的位数.对于第一个数字,我保持简单,因为我没有改变K的值,而对于其他数字,我首先判断数字的平方是否为2位.如果需要,那么每次我都必须增加两次功率,一次增加一位数的正方形.至于数字0,我不能相应地相乘或拼接,我只能通过增加乘方向左移动一步.根据我的假设,这应该是完美的,但这不是正确的,因为它在处理数字中间的0‘S时出现了问题.

例如:对于n=3210987654,预期为9410816449362516,但得到941816449362516

推荐答案

要处理这样的大数字操作,最好的方法通常是将数字计算为字符串,就像经常对大数字(如信用卡号码)所做的那样.一旦将数字转换为字符串,就可以根据需要单独处理每个数字,以满足问题场景的需要.下面是数字平方函数的重构版本,以及"main"函数中的测试工具.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned long long square_digits(long long n)
{
    char work[32];
    long long x = 1;
    long long result = 0;

    sprintf(work, "%lld", n);                               /* Store value in a string          */

    for (int i = (strlen(work) - 1); i >= 0; i--)           /* Evaluate each digit character    */
    {
        result += (work[i] - '0') * (work[i] - '0') * x;    /* Square the digit value and multiply by a succesive power of 10   */

        x *= 10;

        if (work[i] > '3')                                  /* Increase multiplier by 10 again for a two digit square           */
            x *= 10;
    }

    return result;
}

int main()
{
    long long i;

    printf("Enter a value: ");
    scanf("%lld", &i);

    printf("Result for %lld is %lld\n", i, square_digits(i));
    return 0;
}

以下是要点.

  • 要计算的整数值被转换为字符串值.
  • 从第一个数字开始,每个字符被平方,然后乘以一个功变量,该功变量的值被连续地递增"10"或"100",这取决于平方数位的大小,该平方数位可容纳遇到"0".
  • 一旦计算完所有数字,就会返回结果

用您的示例测试这个重构后的代码,创建了以下终端输出.

craig@Vera:~/C_Programs/Console/SquareInt/bin/Release$ ./SquareInt 
Enter a value: 3210987654
Result for 3210987654 is 9410816449362516

继续判断这条可能的路由.

C++相关问答推荐

如何将FileFilter添加到FileDialog GTK 4

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

如何解决C中的严格别名?

我可以在C中声明不同长度数组的数组而不带变量名吗?

二进制计算器与gmp

为什么我不能只在内存地址中添加一个int来寻址任何数组?

函数内的局部字符指针

理解C版宏(看起来像未声明的变量?)

如何在C++中安全地进行浮点运算

在C中创建任意类型的只读指针参数

C将数组传递给函数以修改数组

通过k&;r语法的c声明无效

如何在不使用字符串的情况下在c中编写函数atof().h>;

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

如何将两个uint32_t值交织成一个uint64_t?

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

用C++高效解析HTTP请求的方法

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

C11 嵌套泛型

C simd _m128 晶圆厂