首页 > 其他分享 >P1010 [NOIP1998 普及组] 幂次方(十进制转二进制)(递归)

P1010 [NOIP1998 普及组] 幂次方(十进制转二进制)(递归)

时间:2023-12-25 19:33:19浏览次数:43  
标签:cout int P1010 二进制 num NOIP1998 次方 -- include

P1010 [NOIP1998 普及组] 幂次方

个人感想

终于能真正自主解决一道纯递归题目了,完成前面那次P1928 外星密码的遗憾了
十进制转化二进制再处理也顺利搞定(之前洛谷月赛就有相似题目,当时觉得很难就没写,太亏了)

十进制转二进制

样例:

int a[]
while (n != 0) {
		if (n % 2 == 1) {
			a[num] = 1;
		} else {
			a[num] = 0;
		}
		num++;
		n /= 2;
	}

用一个数组来存储二进制数的每一位,就可以很方便的对二进制数做处理(位运算还不懂)

题目思路

跟之前那道题一样,对一个括号内包含括号直接做递归处理,这里要注意一下在2[0],2[1],还有对+号的特判就ok了。

#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <iomanip>
using namespace std;
int a[100];

void check(int n) {

	int b[16];
	for (int i = 0; i <= 15; i++) {
		b[i] = 0;
	}
	int num = 0;
	while (n != 0) {
		if (n % 2 == 1) {
			b[num] = 1;
		} else {
			b[num] = 0;
		}
		num++;
		n /= 2;
	}
	for (int i = num; i >= 0 ; i--) {
		if (b[i] != 0) {
			if (i == 1) {
				cout << 2;
				if (b[0] == 1) {
					cout << "+";
				}
			} else if (i == 0) {
				cout << "2(0)";
			} else {
				cout << 2 << "(";
				check(i);
				cout << ")";
				for (int j  = i - 1; j >= 0; j--) {
					if (b[j] == 1) {
						cout << "+";
						break;
					}
				}
			}

		}
	}
}

int main() {
	int n;
	cin >> n;
	int num = 0;
	while (n != 0) {
		if (n % 2 == 1) {
			a[num] = 1;
		} else {
			a[num] = 0;
		}
		num++;
		n /= 2;
	}
	for (int i = num; i >= 0 ; i--) {
		if (a[i] != 0) {
			if (i == 1) {
				cout << 2;
				if (a[0] == 1) {
					cout << "+";
				}
			} else if (i == 0) {
				cout << "2(0)";
			} else {
				cout << 2 << "(";
				check(i);
				cout << ")";
				for (int j = i - 1; j >= 0; j--) {
					if (a[j] == 1) {
						cout << "+";
						break;
					}
				}
			}

		}
	}

	return 0;
}

标签:cout,int,P1010,二进制,num,NOIP1998,次方,--,include
From: https://www.cnblogs.com/sdlypsck/p/17926823.html

相关文章

  • 【Mathematical Model】Python拟合一元一/二次方程(线性回归)
    ​        Python中可以使用多种库进行拟合方程,其中最常用的是NumPy和SciPy。NumPy是一个用于处理数组和矩阵的库,而SciPy则提供了大量的科学计算函数,包括拟合算法。1一元一次方程拟合    需要注意的是我们这里的方程需要我们自己定义好,然后再通过curve_fit......
  • 【洛谷】P1024 [NOIP2001 提高组] 一元三次方程求解 (二分)
    题目描述见此:P1024如何求一个方程的根呢qwq首先,根是什么,函数y=f(x)有零点⇔方程f(x)=0有实数根⇔函数y=f(x)的图象与x轴有交点。回顾我们高一学过的一个定理:零点存在性定理:如果函数y=f(x)在区间[a,b]上的图象是连续不断的一条曲线,并且有f(a)·f(b)<0,那么,函数y=f(x)在区间(a,b)......
  • 1612:计算2的N次方
    这是一道喜闻乐见的高精度题首先错误代码#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[10001];memset(a,0,sizeof(a));a[1]=1;intn,m,s,t=0,len=0;scanf("%d",&n);for(inti=1;i<=n;i++){for(i......
  • P1024 [NOIP2001 提高组] 一元三次方程求解( 普及- ) 题解
    题目传送门思路:1可以直接暴力2二分搜索答案3盛金公式一元三次方程:\(ax^3+cx^2+d=0\)重根判别公式:\(A=b^2-3ac\)\(B=bc-9ad\)\(C=c^2-3bd\)当\(A=B=0\)时,\(X1=X2=X3=-b/3a=-c/b=-3d/c\)4牛顿迭代法:对于一个已知的x值,每一次根据函数在这一点的导数,把x移动到,切......
  • 幂次方
    [NOIP1998普及组]幂次方题目描述任何一个正整数都可以用的幂次方表示。例如$137=27+23+2^0$。同时约定次方用括号来表示,即可表示为。由此可知,可表示为进一步:(用表示),并且。所以最后可表示为。又如所以最后可表示为。输入格式一行一个正整数。输出格式符......
  • 用零点存在定理看二次方程根的分布
    前言以前写过一篇关于二次方程根的分布问题的博文,感觉思路混乱,也不想再修改,故重新开一篇博文探讨这个问题,初次尝试用零点存在定理来分析二次方程根的分布,自编题目,有待商榷,希望多提宝贵意见。典例分析为了降低思维的难度,我们首先看这个比较特殊的例子,已知函数\(f(x)=-x^2+2x+......
  • P1679 神奇的四次方数
    一个数可以被无限次的选,所以是完全背包,然后预处理一下就好啦#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intf[N];intmain(){ memset(f,0x3f,sizeoff); f[0]=0; intn; cin>>n; for(inti=1;i<=20;i++){ intx=i*i*i*i; for(intj=x;j<=n;......
  • [NOIP1998 普及组] 阶乘之和
    [NOIP1998普及组]阶乘之和题目描述用高精度计算出()。其中!表示阶乘,定义为。例如,。输入格式一个正整数。输出格式一个正整数,表示计算结果。样例#1样例输入#13样例输出#19提示【数据范围】对于的数据,。【其他说明】注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围......
  • (C语言)1到50的阶乘之和列表,参考用,洛谷:P1009 [NOIP1998 普及组] 阶乘之和
    1到50列表,阶乘之和S=1!+2!+3!+⋯+n!(n≤50)1::12::33::94::335::1536::8737::59138::462339::40911310::403791311::4395471312::52295631313::674997711314::9392826831315::140160263631316::2232439252431317::37801182062031318::678038552634831319::12842......
  • HashMap的长度是2的幂次方
    为了能让HashMap存取高效,尽量减少碰撞,也就是要尽量把数据分配均匀。Hash值的范围值-2147483648到2147483647,前后加起来大概40亿的映射长度,只要哈希函数映射的比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。......