进制转换规律的一点发现

进制转换规律的一点发现

前两天刷题刷到这样一道题目,然后问了大佬这种解法的思路,才恍然大悟...

题意:

给一个长度不超过 18 的 01 串,你需要输出这个串在 2, 3, 4, 5, 6, 7, 8, 9, 10 进制表示下的数值在 10 进制下的和。

输入描述:
第一行是一个正整数 T (T<=100000),表示测试数据的组数,
接下来 T 行,每行包含一个长度不超过 18 的 01 串,保证没有前导零。

输出描述:
对于每组测试数据,输出一个整数。
示例1
输入

2
10
101

输出

54
393

当时我在想第一个样例字串是10,那它十进制数就是2咯,那三、四、五....九进制数不都是2嘛,但是2*9=18,根本不是54,哈哈哈哈当场笑喷!!!再细读题意,在K进制下表示下的数值,比如10在三进制表示的值为0*30+1*31=3,在四进制表示的值为0*40+1*41.写出来谁都会,但是写成程序就一脸懵逼,我在想它干脆让我写个进制转换器出来得了。

我也是后来才发现的规律,我们可以发现,这个01串在K进制表示的值都是从这个串(命名str)的最后一位开始进行计算,然后往前取数再进行计算,然后K(这里假设是三进制)开始发生变化,第一个肯定1,因为任何数0次幂是1,接着就是31=3,再接着就是32=9,也就是3*3,这里需要拿一个变量来记录进制数本身的变化,先上一波代码~

Code:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+7;
const long long mod=1e9+7;
LL str,sum;
int T;
LL Binary(int i)
{
	LL num=str,m=1,ans=0;
	while(num!=0)
	{
		ans+=num%10*m;
		m=m*i;
		num=num/10;
	}
	return ans;	
}

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		sum=0;
		scanf("%lld",&str);
		for(int i=2;i<=10;i++)
			sum+=Binary(i);
		printf("%lld\n",sum);
	}
	return 0;
}

问了某佬才懂咋写的,重点是写出Binary这个函数,某佬先问我1001在K进制下表示的值,我就说是k0*1+k1*0+k2*0+k3*1,但是还是不会(人笨就是这样~),接着大佬说str%10就可以取出最后一位,拿个变量m来表示k的几次方的值就可以了。

规律:str%10可以取出这个01串的最后一位(前提是01串),然后用str/10来去掉最后一位,再判断str是不是为0,假如为0就说明已经操作完。

举栗子举栗子:str=1001吧,1001%10=1,1也就是最后一位咯,然后初始化m=1,k^0*1=m*1=1*1就可以得出第一步,接着用1001/10=100,就把最后一位1去掉了,按照这样的规律,到最后一步1/10=0,就会不满足条件,无法进入循环,直接把它累加的值return一下即可。


不过嘿嘿,没错,又有一个函数,那就是strtol()函数,它的原型:long int strtol (const char* str, char** endptr, int base);
作用将一个字符串转换为长整型long,这个说多没意思,直接上网搜就好。
Code:

 #include<stdio.h>
 #include<iostream>
 #include<algorithm>
 #include<stdlib.h>
 #include<string.h>
 #include<math.h>
 using namespace std;
 typedef long long LL;
 const int maxn=1e5+7;
 const long long mod=1e9+7;
 int T;
 LL sum;
 char str[20];
 int main()
 {
 	scanf("%d",&T);
 	while(T--)
 	{
 		sum=0;
 		scanf("%s",str);
 		for(int i=2;i<=10;i++)
 			sum+=strtol(str,NULL,i);
 		printf("%lld\n",sum);
 	}	
 	return 0;
 }
 

看了一下平台记录 :

方案 运行时间(ms) 使用内存(KB)
方案一 87 2064
方案二 138 2148

调用函数虽然说简洁一些,但是时间上还是有一定差距的~

posted @ 2020-02-01 12:36  ~K2MnO4  阅读(371)  评论(0)    收藏  举报