假设我们在C语言中有这样一个程序,它判断一个数字是否回文,根本不使用任何数组(所以不要使用任何使用数组的答案)

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

int NumOfDigits(long long x) {
    int sum = 1;
    while (x / 10 != 0) {
        sum ++;
        x = x / 10;
    }
    return sum;
}

int isPal(long long x) {
    int f, c, front, back, sum;
    sum = NumOfDigits(x);
    
    c = round(pow(10,(sum-2)));
    front = x / round(pow(10,(sum - 1)));
    back = x % 10;
    f = 1; 

    while (x != 0 && f == 1 && c != 0) {
        if (front == back) {
           x = (x / 10) % c;
           c /= 100;
           sum -=2;
           front = x / round(pow(10,(sum-1)));
           back = x % 10;
        } else {
           f = 0;
        }
    }
    if (f) {
        return 1;
    } else {
        return 0;
    }
}

int main() {
    int f;
    long long x;
    scanf("%lld", &x);
    f = isPal(x);
    if (f) {
        printf("yes");
    } else {
        printf("no");
    }
    printf("\n");
}

基本上,这个算法每次都会判断第一个和最后一个数字,然后将数字减go 2,所以如果我们有345543,首先是345543,然后是4554,55等等.这个程序的要点是,例如,给定数字900075181570009,它说它不是回文,但这是因为计算机删除了数字左侧的0.所以当它达到0007518157000的时候,基本上就是7518157000,这不是一个回文数字.那么,我们如何在不使用数组的情况下修改算法,以达到预期的结果呢?

推荐答案

在测试代码时,我确实注意到,900075181570009被指定为不是回文的结果是一个问题,因为变量是一个整数,因此在某些情况下太小,无法包含10的适当幂.当我将其指定为"Long Long"变量时,数字900075181570009被指定为回文.

关于测试带有前导零(和尾随零)的数字,这似乎是一个必要的函数,它可以重复地将数字除以10,直到所有尾随零都被删除,然后执行回文测试.以下是重构后的代码.首先是从候选数字中删除尾随零的附加函数.

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

long long lagging(long long z)
{
    long long work = z;

    while (1)
    {
        if ((work % 10) != 0)
            break;

        work /= 10;
    }

    return work;
}

接下来,是重构后的回文测试函数,其中变量"c"被放大,以及测试值的初始清理.

    int isPal(long long x) {
    int f,front, back, sum;
    long long c;

    x = lagging(x);  /* One off call to additional scrubbing if needed */

    sum = NumOfDigits(x);

在测试您的示例中提到的各种数字时,以下是终端的测试输出.

craig@Vera:~/C_Programs/Console/PalInteger/bin/Release$ ./PalInteger 
Enter a number: 900075181570009
yes
craig@Vera:~/C_Programs/Console/PalInteger/bin/Release$ ./PalInteger 
Enter a number: 0007518157000
yes
craig@Vera:~/C_Programs/Console/PalInteger/bin/Release$ ./PalInteger 
Enter a number: 345543
yes
craig@Vera:~/C_Programs/Console/PalInteger/bin/Release$ ./PalInteger 
Enter a number: 7518157000
yes

一条供您判断的思路.

C++相关问答推荐

CC crate 示例不会与C函数链接

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

为什么双重打印与C中的float具有不同的大小时具有相同的值?

使用额外的公共参数自定义printf

在一个小型玩具项目中实现终端历史记录功能

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

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

Sizeof(&Q;字符串&Q;)的正确输出是什么?

GDB输出ARM助记符

如何使解释器存储变量

在libwget中启用Cookie会导致分段故障

Tic-tac-toe:从文件加载存储

GetText不适用于包含国际字符的帐户名称

程序如何解释变量中的值

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

如何在MSVC中使用intSafe.h函数?

Matlab/Octave对conv2函数使用哪种方法?

SSE 向量与 Epsilon 的比较

C simd _m128 晶圆厂