P1010 幂次方 P1022 计算器的改良
P1010 幂次方
一、题目
https://www.luogu.org/problemnew/show/P1010
二、代码
#include<bits/stdc++.h>
using namespace std; // 根据2的几次幂进行分解
string decompose(int num)
{
if(num==)
{
return "";
} string s = "";
int exp = ; // 指数,比如2=2^1,则指数为1
do
{
if(num & ) // 判断奇数
{
// num=2时,exp==1才为真
string tmp1 = exp== ? "" : "2("+decompose(exp)+")";
string tmp2 = s=="" ? "" : "+"; // 拼接字符串,依题意,要把低次方接在后面
s = tmp1 + tmp2 + s;
} exp++;
} while(num >>= );//每次向右移一位,即除以2 return s;
} int main()
{
int x;
cin>>x;
cout<<decompose(x)<<endl;
return ;
}
P1022 计算器的改良
一、题目
https://www.luogu.org/problemnew/show/P1022
二、代码
#include<bits/stdc++.h>
using namespace std; int main()
{
int coe = ; // coe * x = value, coe即为x的系数
int value = ;
int pos = -; // 数值位于等号左边的数为负(移到右边即为正),位于等号右边的数为正
char c = getchar();
int num = ; // 当前读入的数值
int sign = ; // 当前数值符号,
char x; // 未知数,26个小写字母之一 while(true)
{
if (c>='a' && c<='z')
{
x = c;
if (num == )
{
// 系数为1
coe += -pos * sign; }
else
{
coe += -pos * sign * num; //系数左边为正,右边为负,所以pos要取负
} num = ;
sign = ;
}
else if (c == '-')
{
value += pos * sign * num;
num = ;
sign = -;
}
else if (c == '+')
{
value += pos * sign * num;
num = ;
sign = ;
}
else if (c >= '' && c <= '')
{
num = num * + c - '';
}
else if (c == '=')
{
value += pos * sign * num;
num = ;
sign = ;
pos = -pos; //等号右边pos为正
}
else // 换行的时候,要把最后的数(如果有)累加到valu
{
value += pos * sign * num;
break;
} c = getchar();
} double ans = double(value) / coe;//计算ans printf("%c=%.3f", x, ans == ? abs(ans) : ans);//这涉及一个很坑的地方:C++里0除以一个负数值为-0,专门避免这种情况 return ;
}
UVA524 素数环
一、题目
https://www.luogu.org/problemnew/show/UVA524
二、分析
例1:以n = 4为例。n = 4的排列有
1,2,3,4 相邻两个数相加都是素数,符合题意
1,2,4,3 2和4相加不是素数,不符合题意
1,3,2,4 2和4相加不是素数,不符合题意
1,3,4,2 4和2相加不是素数,不符合题意
1,4,2,3 4和2相加不是素数,不符合题意
1,4,3,2 相邻两个数相加都是素数,符合题意。
所以正确的答案为
1,2,3,4
1,4,3,2
例2:以n = 5为例。n = 5的排列有
1,2,3,4,5 4和5相加不是素数,不符合题意
1,2,3,5,? 3和5相加不是素数,不符合题意
1,2,4,? 2和4相加不是素数,不符合题意
1,2,5,3,? 5和3相加不是素数,不符合题意
1,2,5,4,? 5和4相加不是素数,不符合题意
1,3,? 1和3相加不是素数,不符合题意
1,4,2,? 4和2相加不是素数,不符合题意
1,4,3,2,5 5和1相加不是素数,不符合题意
1,4,3,5,? 3和5相加不是素数,不符合题意
1,4,5,? 4和5相加不是素数,不符合题意
1,5,? 1和5相加不是素数,不符合题意
所以n=5时,没有答案。
三、代码
#include<bits/stdc++.h>
using namespace std; int n;
int a[];
int prime[];
bool visited[]; //visited[num]用来标记num是否被使用了 // pos为数组下标
void dfs(int pos)
{
// num为数组中的数
for(int num=; num<=n; num++)
{
// 如果这个数已经使用,则不能再用
if(visited[num])
{
continue;
} if(prime[a[pos-] + num]) //当前数num与上一个数的和为素数
{
visited[num] = true; // 标记
a[pos] = num; // 存储,后面需要打印出来
if(pos == n) // 放完了n个数
{
if(prime[a[pos] + ]) //这是一个环,所以要计算最后一个数与第一个数1的和
{
for(int j = ; j < n; j++)
{
printf("%d ",a[j]);
}
printf("%d\n", a[n]); //这里很恶心,行末不能有空格
}
}
else
{
dfs(pos + );
} visited[num] = false; //回溯
}
}
} int main()
{
// 素数打表
prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=true; //先处理一下素数 int cnt = ; // 输出的第几组数据
while(scanf("%d",&n) == )
{
cnt++;
printf("Case %d:\n",cnt);
a[] = ; //第一个数是1
visited[] = true; // 这一句可写可不写,因为1就是第一个数
dfs(); //从第二个数开始搜 cout << endl;
} return ;
}
P4326 求圆的面积
一、题目
https://www.luogu.org/problemnew/show/P4326
二、分析
COCI是Crotian Open Competition in Informatics, 即克罗地亚信息学公开赛。
本题的坑点在于有些人不知道所谓的出租车几何下的“圆”其实是一个正方形:
上面这个“圆”中,中心点到边上的任意一点的距离都为|x1 - x2| + |y1 - y2| = 4。
这个“圆”是由上下两个三角形组成的,每个三角形的面积为2r * r / = r * r,所以“圆”的面积为2 * r * r。
#include <iostream>
#include <cstdio>
using namespace std; const double pi = 3.141592653589793; int main()
{
double r;
cin >> r;
printf("%.6f\n", pi * r * r);
printf("%.6f\n", * r * r); return ;
}
P1009 阶乘之和
#include<iostream>
using namespace std; int a[];
int c[];
const int maxDigit=; //最大位数,调试时可设n=4,maxDigit=3 // 阶乘相加
void add(int *a,int *c)
{
int carry = ;
// 比如1!+2!+3!+4!
// i=1时,c[1]=1!=1
// i=2时,c[1]=1+2!=3
// i=3时,c[1]=3+3!=9
// i=4时,c[1]=9+4=13,carry=1,c[1]=3,c[2]=c[2]+a[2]+carry=0+2+1=3
for(int i = ; i <= maxDigit; i++)
{
c[i] += (a[i] + carry);
carry = c[i]/;
c[i] %= ;
}
} //求阶乘
void fact(int *a,int num)
{
int carry = ; // 进位
for(int i=; i <= maxDigit; i++)
{
// 从高位往低位存储数据,比如5!=120,则a[4]=a[5]=...=0,a[3]=1,a[2]=2,a[1]=0
a[i] = a[i] * num + carry;
carry = a[i] / ;
a[i] %= ;
}
} int main()
{
int n;
cin >> n;
a[] = ;
for(int i=;i<=n;i++)
{
fact(a, i);
add(a, c);
} bool flag = false; // 当碰到第一个非0时,更新为true
for(int i = ; i >= ; i--)
{
// 左边的0不要打印出来,从第一个非0数字开始打印
// 比如000……000120,打印出120
if(c[i] != )
{
flag = true;
} if(flag)
{
cout << c[i];
}
} return ;
}
P1007 独木桥
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,l,p,maxT=,minT=;
scanf("%d%d",&l,&n); for(int i=;i<=n;i++)
{
scanf("%d",&p);
maxT=max(maxT,max(l+-p,p));
minT=max(minT,min(l+-p,p));
} printf("%d %d",minT,maxT); return ;
}
P1002 过河卒
#include<iostream>
using namespace std; long long a[][]={},n,m,my,mx; int main()
{
cin >> n >> m >> my >> mx;//输入数据 // 整个棋盘往右往下挪两格,这样马处于原点(挪移后
// 变成(2,2)点,往左上方跳不会出现数组越界的情况
n += ; // n行
m += ; // m列
my += ;// 马位于第几行
mx += ;// 马处于第几列 for(int r = ; r <= n; r++) // 共有n+1行
{
for(int c = ; c <= m; c++) // 共有m+1列
{
a[r][c] = a[r - ][c] + a[r][c - ]; // 左侧的数 + 上方的数
a[][]=; // 要初始化为1,若为0后面全是0 // 马的9个控制点
a[my][mx]=;// 马本身的位置
a[my + ][mx + ]=;
a[my + ][mx - ]=;
a[my - ][mx + ]=;
a[my - ][mx - ]=;
a[my + ][mx + ]=;
a[my + ][mx - ]=;
a[my - ][mx + ]=;
a[my - ][mx - ]=;
}
} cout <<a[n][m]; return ;
}
P1010 幂次方 P1022 计算器的改良的更多相关文章
- P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给 ...
- 洛谷—— P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...
- 洛谷P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...
- 2021.07.26 P1022 计算器的改良(字符串)
2021.07.26 P1022 计算器的改良(字符串) 改进: 如果是我出题,我一定把未知数设为ab.buh.bluesky之类的长度不只是1的字符串! 题意: 一个一元一次方程,求解. 分析: 1 ...
- 2021.07.26 P1010 幂次方(数论)
2021.07.26 P1010 幂次方(数论) [P1010 NOIP1998 普及组] 幂次方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.二进制 题意: 用20 ...
- 洛谷 P1010 幂次方 Label:模拟
题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...
- 解题笔记-洛谷-P1010 幂次方
0 题面 题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+ ...
- P1010 幂次方 递归模拟
题目描述 任何一个正整数都可以用22的幂次方表示.例如 137=2^7+2^3+2^0137=27+23+20 同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b). 由此可知,13713 ...
- p1010幂次方---(分治)
题目描述 任何一个正整数都可以用222的幂次方表示.例如 137=27+23+20137=2^7+2^3+2^0 137=27+23+20 同时约定方次用括号来表示,即aba^bab 可表示为a(b) ...
随机推荐
- 多线程开发之NSThrea
创建并启动 先创建线程,再启动 // 创建 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector( ...
- SpringMVC:拦截器
SpringMVC:拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过 ...
- 理解python中的'*','*args','**','**kwargs'
本文来源:http://blog.csdn.net/callinglove/article/details/45483097 让我们通过以下6步来理解: 1. 通过一个函数调用来理解’*’的作用 2. ...
- ORACLE自增函数,一般函数
1.UNIX时间与普通时间互相转换 1.ORACLE先创建函数方法,再直接使用,MySQL直接使用方法UNIX_TIMESTAMP,FROM_UNIXTIME oracle_to_unix(creat ...
- GitHub上传家庭记账本
GitHub的使用参考之前的博客GitHub的初步了解和使用,并完成了相关的android个人家庭记账本的上传
- python进阶(三)~~~装饰器和闭包
一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...
- 记Windows下初次使用dev C++进行socket编程过程
记初次接触socket编程,在devC++使用Winsock进行socket编程的一个过程,通过在devC++创建2个项目分别是server.client程序项目,感受通过socket使client与 ...
- python的debug神器PySnooper
同事给我推荐了这个调试神器,一直没工夫看,今天看了下. 原文链接: 史上最方便的Python Debug工具|腾讯技术说 体验了下,感觉最好的用法:1.优先逐行调试:2.一些复杂状态处理或者偶现的bu ...
- 刷题32. Longest Valid Parentheses
一.题目说明 题目是32. Longest Valid Parentheses,求最大匹配的括号长度.题目的难度是Hard 二.我的做题方法 简单理解了一下,用栈就可以实现.实际上是我考虑简单了,经过 ...
- 题解 P1403 【[AHOI2005]约数研究】
题目 看到题解区很多人直接给出结论:答案为 \(\displaystyle \sum_{i=1}^n\lfloor{n\over i}\rfloor\) ,没给出证明,这里给出证明 [分析] 首先,我 ...