洛谷 P1015 回文数 解题思路及答案

题目:

解题思路:  首先考虑到 M它的进制是未知的,并且100位之内,显然我们传统的 int、long long型就不能满足其要求,故这里考虑 用数组进行存储 

又因为  不知道输入的时候M是多少位 直接用 int型 数组显然不方便,也不太现实。这里就用到我们 之前的帖子(P1009 高精度算法)里面讲的  用   字符型数组  转换  整形数组 。   整型数组里面存储的是 M这个数的每一位!!!

洛谷 P1009 阶乘之和 (高精度算法)-优快云博客

整体代码为:

#include<stdio.h>
#include<string.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	char arr1[100] = "0";
	scanf("%s", arr1);
	int arr2[150] = { 0 };
	int arr3[150] = { 0 };
	int zu=strlen(arr1);
	int i = 0;
	int g = 0;
	int step = 0;

	for (i = 0; i <= zu - 1; ++i)
	{
		if (arr1[zu - i - 1] >= 'A')
		{
			arr2[i] = arr1[zu - i - 1] - 'A';
			arr2[i] += 10;
		}
		else
		arr2[i] = arr1[zu - i - 1] - '0';
	}


  int jin = 0;
	
  do {
	  for (g = 149; g >= 0; --g)
	  {
		  if (arr2[g] != 0)
			  break;
	  }
	  for (i = 0; i <= g; ++i)
		  arr3[i] = arr2[g - i];

	  int floag = 1;
	  for (i = 0; i <= g / 2 + 1; ++i)
	  {
		  if (arr2[i] != arr3[i])
		  {
			  floag = 0;
			  break;

		  }
	  }
	  if (floag == 1)
	  {
		  printf("STEP=%d", step);
		  break;
	  }
	  else
	  {
		  step++;
		  jin = 0;
		  for (i = 0; i <=799; ++i)
		  {
			  arr2[i] = arr2[i] + arr3[i] + jin;
			  jin = arr2[i] / n;
			  arr2[i] = arr2[i] % n;
		  }


	  }
  } while (step <= 30);

  if (step == 31)
	  printf("Impossible!");


		return 0;
}

代码分析

字符数组 用来接收输入的数字    在内存中字符是以ASC||码进行储存的

因为数字有100位 后面会 反复地加  存在进位  所以 数组大小 150 比较合适 

arr2[150]      arr3[150]     

然后就是下面,因为可能得进制有2~10 以及16  所以要分类讨论 

2~10 进制的话 其可能的数字就是 0~9   所以减去 字符‘0’  即可 得到的就是实际输入的数字

16进制的话 有ABCDEF    这道题的测试点是默认输入大写字母哈!!!!

 所以 这部分输入的数字  单独拎出来     最后+10 就好

依旧是倒着存  因为后边好进位   整体知识点和 高精度算法一样    不多赘述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值