【第二学期第十周学习记录】

记录一道我来来回回提交了十几次都没过的题QWQ;

一定不要用pow函数!!!QAQ

一定不要用pow函数!!!QAQ

一定不要用pow函数!!!QAQ

我知道在这里塞一堆一级标题很突兀,可是这点真的好重要,我来来回回十几次都是因为这个点错掉的QAQ

G. Disappearing Number

题目链接:https://codeforces.com/gym/105257/problem/G

思路+代码

正解

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define int long long

int _xto10(int n,int x){
	string s=to_string(n);
	int len=s.size();
	int nn=0;
	for(int i=0;i<len;i++){
		nn*=x;
		nn+=(s[i]-'0');
	}
	return nn;
}
signed main()
{
	int t;cin>>t;
	while(t--){
		int n,x;cin>>n>>x;
		int ans;
		if(x==9)	ans=_xto10(n,9)+1;
		else{
			string s=to_string(n);
			for(int i=0;i<s.size();i++){
				if(s[i]-'0'>x){
					s[i]=s[i]-1;
				}
			}
			n=stoll(s);
			ans=_xto10(n,9)+1;
		}	
		cout<<ans<<"\n";
	} 
	return 0;
} 

非正解(vp的时候是这么想的QAQ)

举个例子说明思路:假设n=5421,x=3;
(思路有点类似小学奥数的纯找规律QAQ)

  1. 整体思路是用正常的序数-需要删去的数字的个数;
  2. 如例子,可以把5421需要删去的个数拆成1~5000内需要删去的个数,1~400内需要删去的个数,1~20内需要删去的个数和1~1内需要删去的个数之和;
  3. 拿计算1~5000内需要减去的个数为例:又可以拆到以每一千需要减去的个数为一个单位,一共需要减去几个单位;
  4. 所以我们可以专门造一个数组(我的代码里边用的a数组)来记录每一位的一个单位需要减去的个数(如5000是四位数,所以每一千需要减去的个数用a[4]来储存)
  5. 但这里有需要判断一下:比如0~5000中5>x(3),此时需要减去的个数就是1000+(5-1)*a[4];而在0~20中2<x(3),此时需要减去的个数就是2*a[4];
#include<bits/stdc++.h>
using namespace std;
#define int long long

int a[21];
int lifang(int a,int b){
	int ans=1;
	for(int i=1;i<=b;i++){
		ans*=a; 
	}
	return ans;
}//用来代替 pow 函数
signed main()
{
	a[1]=0;
	a[2]=1;
	a[3]=19;
	for(int i=4;i<=20;i++){
		a[i]=lifang(10,i-2)+9*a[i-1]; 
	} 
	int t;cin>>t;
	while(t--){
		string s;int x;
		cin>>s>>x;
		int n=stoll(s);
		int ans=n;
		for(int i=0;i<s.size();i++){
			int p=s[i]-'0'; //开头数字 
			int q=s.size()-i-1;//后边几个0;数值=位数-1; 
			int t=0;
			if(p>x){
				t+=lifang(10,q)+(p-1)*a[q+1];
			}
			else if(p<x){
				t+=p*a[q+1];
			}
			ans-=t;
		}
		cout<<ans+1<<endl;//自然数从0开始算,所以要+1;
	}
	return 0;
 } 

碎碎念

  • 非正解的这个方法用pow函数 样例4 会WA掉:因为pow函数它是浮点类型,所以它计算很大的数字的时候,就会有浮点的误差(比如小数点后很多为突然冒出一个1,换算成整数看似没有影响,但是数字很大计算很多次的话结果就不是正确结果了),然后他就wa了;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值