力扣算法题 ”回文数“ 最详细解题(C语言)

追梦者你好,再次文章你会学到最神奇且最普通的数“回文数”

1.什么是回文数?

      神奇的回文数到底是什么鬼样?其实很简单,比如“12321”就是回文数,你发现什么规律了吗?

对!中间对称,也就是把“12321” 从后往前倒序后又等于本身“12321”,回文数必须大于等于0的数。你知道了吗!

2.怎么用C语言来判断一个数是否为回文数?

第一步:接受待测数子并判断正负溢出,溢出返回 0 ,没有溢出备份下来并继续下一步

第二步:计算待测数字的位数(倒序是要用到)

第三步:把待测数字倒序,判断书否溢出,溢出返回 0 ,没有溢出存储下来并继续下一步

第四步:比较 待测数字 和 倒序后的数字 是否一样,一样说明是回文数,判断回文数函数返回 1

否则 不是回文数 返回 0

3.废话不多说,上代码

//力扣刷题网上的题 “回文数”解法 
//回文数的特点  1.大于等于0   2.把每一位倒序后还是同一个人数 比如"12321" "1" "666" "565"...
 
#include <stdio.h>
#include <math.h>// pow()函数头 
#include <stdlib.h> 


//这个函数直接拷贝到力扣网可以通关 
int isPalindrome(int x);//判断回文数 是 返回 1 否 返回 0 


int main(int argc,char * argv[])//主函数 程序入口 
{
	int i,x[]={123,121,12321,156,565,9999,665,15951,0,1,11,-1,-121}; //测试数组
	
	//循环判断测试数据 
	for(i=0;i<sizeof(x)/sizeof(x[0]);i++) 
	{
		if(1==isPalindrome(x[i]))
		{
			printf("数<%d>是回文数\n",x[i]);//是回文数 
		}
		else
		{
			printf("数<%d>不是回文数\n",x[i]);//不是回文数 
		}	
	}	
	return 0;
}

//判断是否为回文数 
int isPalindrome(int x){

long long temp , tempss;//临时存储变量 
char numsize=0  , i;  //存储待测数字 

if(x<0)//待测数字小于0 返回0 
{
    return 0;
}

if(x>pow(2,31)-1)//判断正溢出 
    return 0;

   tempss = temp=x;//备份变量 

    while(temp)//计算待测数字的位数 
    {
        temp/=10;
        numsize++;//待测数字的位数 
    }

    for(i=0;i<numsize;i++)//按尾数倒序数字 
    {
        temp=temp + (tempss%10)*pow(10,numsize-1-i);//
        tempss/=10;
    }
    
if(temp>2147483647)//判断转换后的正溢出
    return 0;
	
 if(temp==x)//判断原待测数字和倒序后的数字是否相同 
    return 1;//是(是回文数) 返回 1 
else
    return 0;//否则返回 0 

} 

4.输出结果:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目描述: 给出两个非空链表来表示两个非负整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以零开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解题思路: 目中要求我们按照逆序的方式存储两个非负整数,也就是说链表的头节点表示该数的个位,第二个节点表示该数的十位,以此类推。 因此,我们可以从两个链表的头节点开始,对应位相加,并记录进位,将结果添加到新的链表中。如果有进位,需要在下一位相加时加上进位。 需要注意的是,当两个链表的长度不一致时,可以将较短的链表的缺失位看作是 0。 最后,如果最高位有进位,还需要在新链表的最高位添加一个值为 1 的节点。 C 语言代码实现: /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ struct ListNode *head = NULL, *tail = NULL; int carry = 0; while (l1 || l2) { int n1 = l1 ? l1->val : 0; int n2 = l2 ? l2->val : 0; int sum = n1 + n2 + carry; if (!head) { head = tail = malloc(sizeof(struct ListNode)); tail->val = sum % 10; tail->next = NULL; } else { tail->next = malloc(sizeof(struct ListNode)); tail = tail->next; tail->val = sum % 10; tail->next = NULL; } carry = sum / 10; if (l1) l1 = l1->next; if (l2) l2 = l2->next; } if (carry > 0) { tail->next = malloc(sizeof(struct ListNode)); tail = tail->next; tail->val = carry; tail->next = NULL; } return head; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值