P1010 幂次方

一、题目

https://www.luogu.org/problemnew/show/P1010

二、代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // 根据2的几次幂进行分解
  5. string decompose(int num)
  6. {
  7. if(num==)
  8. {
  9. return "";
  10. }
  11.  
  12. string s = "";
  13. int exp = ; // 指数,比如2=2^1,则指数为1
  14. do
  15. {
  16. if(num & ) // 判断奇数
  17. {
  18. // num=2时,exp==1才为真
  19. string tmp1 = exp== ? "" : "2("+decompose(exp)+")";
  20. string tmp2 = s=="" ? "" : "+";
  21.  
  22. // 拼接字符串,依题意,要把低次方接在后面
  23. s = tmp1 + tmp2 + s;
  24. }
  25.  
  26. exp++;
  27. } while(num >>= );//每次向右移一位,即除以2
  28.  
  29. return s;
  30. }
  31.  
  32. int main()
  33. {
  34. int x;
  35. cin>>x;
  36. cout<<decompose(x)<<endl;
  37. return ;
  38. }

P1022 计算器的改良

一、题目

https://www.luogu.org/problemnew/show/P1022

二、代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. int coe = ; // coe * x = value, coe即为x的系数
  7. int value = ;
  8. int pos = -; // 数值位于等号左边的数为负(移到右边即为正),位于等号右边的数为正
  9. char c = getchar();
  10. int num = ; // 当前读入的数值
  11. int sign = ; // 当前数值符号,
  12. char x; // 未知数,26个小写字母之一
  13.  
  14. while(true)
  15. {
  16. if (c>='a' && c<='z')
  17. {
  18. x = c;
  19. if (num == )
  20. {
  21. // 系数为1
  22. coe += -pos * sign;
  23.  
  24. }
  25. else
  26. {
  27. coe += -pos * sign * num; //系数左边为正,右边为负,所以pos要取负
  28. }
  29.  
  30. num = ;
  31. sign = ;
  32. }
  33. else if (c == '-')
  34. {
  35. value += pos * sign * num;
  36. num = ;
  37. sign = -;
  38. }
  39. else if (c == '+')
  40. {
  41. value += pos * sign * num;
  42. num = ;
  43. sign = ;
  44. }
  45. else if (c >= '' && c <= '')
  46. {
  47. num = num * + c - '';
  48. }
  49. else if (c == '=')
  50. {
  51. value += pos * sign * num;
  52. num = ;
  53. sign = ;
  54. pos = -pos; //等号右边pos为正
  55. }
  56. else // 换行的时候,要把最后的数(如果有)累加到valu
  57. {
  58. value += pos * sign * num;
  59. break;
  60. }
  61.  
  62. c = getchar();
  63. }
  64.  
  65. double ans = double(value) / coe;//计算ans
  66.  
  67. printf("%c=%.3f", x, ans == ? abs(ans) : ans);//这涉及一个很坑的地方:C++里0除以一个负数值为-0,专门避免这种情况
  68.  
  69. return ;
  70. }

UVA524 素数环

一、题目

https://www.luogu.org/problemnew/show/UVA524

二、分析

例1:以n = 4为例。n = 4的排列有

  1. 1,2,3,4 相邻两个数相加都是素数,符合题意
  2. 1,2,4,3 24相加不是素数,不符合题意
  3. 1,3,2,4 24相加不是素数,不符合题意
  4. 1,3,4,2 42相加不是素数,不符合题意
  5. 1,4,2,3 42相加不是素数,不符合题意
  6. 1,4,3,2 相邻两个数相加都是素数,符合题意。

所以正确的答案为

  1. 1,2,3,4
  2. 1,4,3,2

例2:以n = 5为例。n = 5的排列有

  1. 1,2,3,4,5 45相加不是素数,不符合题意
  2. 1,2,3,5,? 35相加不是素数,不符合题意
  3. 1,2,4,? 24相加不是素数,不符合题意
  4. 1,2,5,3,? 53相加不是素数,不符合题意
  5. 1,2,5,4,? 54相加不是素数,不符合题意
  6. 1,3,? 13相加不是素数,不符合题意
  7. 1,4,2,? 42相加不是素数,不符合题意
  8. 1,4,3,2,5 51相加不是素数,不符合题意
  9. 1,4,3,5,? 35相加不是素数,不符合题意
  10. 1,4,5,? 45相加不是素数,不符合题意
  11. 1,5,? 15相加不是素数,不符合题意

所以n=5时,没有答案。

三、代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n;
  5. int a[];
  6. int prime[];
  7. bool visited[]; //visited[num]用来标记num是否被使用了
  8.  
  9. // pos为数组下标
  10. void dfs(int pos)
  11. {
  12. // num为数组中的数
  13. for(int num=; num<=n; num++)
  14. {
  15. // 如果这个数已经使用,则不能再用
  16. if(visited[num])
  17. {
  18. continue;
  19. }
  20.  
  21. if(prime[a[pos-] + num]) //当前数num与上一个数的和为素数
  22. {
  23. visited[num] = true; // 标记
  24. a[pos] = num; // 存储,后面需要打印出来
  25. if(pos == n) // 放完了n个数
  26. {
  27. if(prime[a[pos] + ]) //这是一个环,所以要计算最后一个数与第一个数1的和
  28. {
  29. for(int j = ; j < n; j++)
  30. {
  31. printf("%d ",a[j]);
  32. }
  33. printf("%d\n", a[n]); //这里很恶心,行末不能有空格
  34. }
  35. }
  36. else
  37. {
  38. dfs(pos + );
  39. }
  40.  
  41. visited[num] = false; //回溯
  42. }
  43. }
  44. }
  45.  
  46. int main()
  47. {
  48. // 素数打表
  49. prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=prime[]=true; //先处理一下素数
  50.  
  51. int cnt = ; // 输出的第几组数据
  52. while(scanf("%d",&n) == )
  53. {
  54. cnt++;
  55. printf("Case %d:\n",cnt);
  56. a[] = ; //第一个数是1
  57. visited[] = true; // 这一句可写可不写,因为1就是第一个数
  58. dfs(); //从第二个数开始搜
  59.  
  60. cout << endl;
  61. }
  62.  
  63. return ;
  64. }

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。

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4.  
  5. const double pi = 3.141592653589793;
  6.  
  7. int main()
  8. {
  9. double r;
  10. cin >> r;
  11. printf("%.6f\n", pi * r * r);
  12. printf("%.6f\n", * r * r);
  13.  
  14. return ;
  15. }

P1009 阶乘之和

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int a[];
  5. int c[];
  6. const int maxDigit=; //最大位数,调试时可设n=4,maxDigit=3
  7.  
  8. // 阶乘相加
  9. void add(int *a,int *c)
  10. {
  11. int carry = ;
  12. // 比如1!+2!+3!+4!
  13. // i=1时,c[1]=1!=1
  14. // i=2时,c[1]=1+2!=3
  15. // i=3时,c[1]=3+3!=9
  16. // i=4时,c[1]=9+4=13,carry=1,c[1]=3,c[2]=c[2]+a[2]+carry=0+2+1=3
  17. for(int i = ; i <= maxDigit; i++)
  18. {
  19. c[i] += (a[i] + carry);
  20. carry = c[i]/;
  21. c[i] %= ;
  22. }
  23. }
  24.  
  25. //求阶乘
  26. void fact(int *a,int num)
  27. {
  28. int carry = ; // 进位
  29. for(int i=; i <= maxDigit; i++)
  30. {
  31. // 从高位往低位存储数据,比如5!=120,则a[4]=a[5]=...=0,a[3]=1,a[2]=2,a[1]=0
  32. a[i] = a[i] * num + carry;
  33. carry = a[i] / ;
  34. a[i] %= ;
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. int n;
  41. cin >> n;
  42. a[] = ;
  43. for(int i=;i<=n;i++)
  44. {
  45. fact(a, i);
  46. add(a, c);
  47. }
  48.  
  49. bool flag = false; // 当碰到第一个非0时,更新为true
  50. for(int i = ; i >= ; i--)
  51. {
  52. // 左边的0不要打印出来,从第一个非0数字开始打印
  53. // 比如000……000120,打印出120
  54. if(c[i] != )
  55. {
  56. flag = true;
  57. }
  58.  
  59. if(flag)
  60. {
  61. cout << c[i];
  62. }
  63. }
  64.  
  65. return ;
  66. }

P1007 独木桥

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. int main()
  5. {
  6. int n,l,p,maxT=,minT=;
  7. scanf("%d%d",&l,&n);
  8.  
  9. for(int i=;i<=n;i++)
  10. {
  11. scanf("%d",&p);
  12. maxT=max(maxT,max(l+-p,p));
  13. minT=max(minT,min(l+-p,p));
  14. }
  15.  
  16. printf("%d %d",minT,maxT);
  17.  
  18. return ;
  19. }

P1002 过河卒

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. long long a[][]={},n,m,my,mx;
  5.  
  6. int main()
  7. {
  8. cin >> n >> m >> my >> mx;//输入数据
  9.  
  10. // 整个棋盘往右往下挪两格,这样马处于原点(挪移后
  11. // 变成(2,2)点,往左上方跳不会出现数组越界的情况
  12. n += ; // n行
  13. m += ; // m列
  14. my += ;// 马位于第几行
  15. mx += ;// 马处于第几列
  16.  
  17. for(int r = ; r <= n; r++) // 共有n+1行
  18. {
  19. for(int c = ; c <= m; c++) // 共有m+1列
  20. {
  21. a[r][c] = a[r - ][c] + a[r][c - ]; // 左侧的数 + 上方的数
  22. a[][]=; // 要初始化为1,若为0后面全是0
  23.  
  24. // 马的9个控制点
  25. a[my][mx]=;// 马本身的位置
  26. a[my + ][mx + ]=;
  27. a[my + ][mx - ]=;
  28. a[my - ][mx + ]=;
  29. a[my - ][mx - ]=;
  30. a[my + ][mx + ]=;
  31. a[my + ][mx - ]=;
  32. a[my - ][mx + ]=;
  33. a[my - ][mx - ]=;
  34. }
  35. }
  36.  
  37. cout <<a[n][m];
  38.  
  39. return ;
  40. }

P1010 幂次方 P1022 计算器的改良的更多相关文章

  1. P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给 ...

  2. 洛谷—— P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...

  3. 洛谷P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...

  4. 2021.07.26 P1022 计算器的改良(字符串)

    2021.07.26 P1022 计算器的改良(字符串) 改进: 如果是我出题,我一定把未知数设为ab.buh.bluesky之类的长度不只是1的字符串! 题意: 一个一元一次方程,求解. 分析: 1 ...

  5. 2021.07.26 P1010 幂次方(数论)

    2021.07.26 P1010 幂次方(数论) [P1010 NOIP1998 普及组] 幂次方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.二进制 题意: 用20 ...

  6. 洛谷 P1010 幂次方 Label:模拟

    题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...

  7. 解题笔记-洛谷-P1010 幂次方

    0 题面 题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+ ...

  8. P1010 幂次方 递归模拟

    题目描述 任何一个正整数都可以用22的幂次方表示.例如 137=2^7+2^3+2^0137=27+23+20 同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b). 由此可知,13713 ...

  9. p1010幂次方---(分治)

    题目描述 任何一个正整数都可以用222的幂次方表示.例如 137=27+23+20137=2^7+2^3+2^0 137=27+23+20 同时约定方次用括号来表示,即aba^bab 可表示为a(b) ...

随机推荐

  1. Codeforces 442A Borya and Hanabi

    有五种花色 外加 五种点数 共25张牌,每次有n张牌,主人知道这n张牌中有哪些牌,并且哪种牌有几张,但是不知道具体是哪张牌,他可以问某种花色,然后知道了哪几张是该花色,也可以问点数,然后就知道了哪几张 ...

  2. 2,The AudioContext was not allowed to start.

    The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on t ...

  3. Idea 中的快捷键(mac)

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  4. JZOJ-2019-11-5 B组

    T1 给出一二维01矩阵\(f_{i,j}\), 定义点\((x_a, y_a), (x_b, y_b)\)的「距离」为\(max\{|x_a-x_b|, |y_a-y_b|\}\) 求出一矩阵\(w ...

  5. Mybatis框架的简单配置

    Mybatis 的配置 1.创建项目(当然,这是废话) 2.导包 下载mybatis-3.2.0版:https://repo1.maven.org/maven2/org/mybatis/mybatis ...

  6. 日志处理中一些shell命令技巧

    日志处理中一些shell命令技巧 阴差阳错的做的日志分析,前途未卜的这段日子,唯一还有点意思的可能就是手动的处理大量日志.总结一下. 日志文件的输入是动则几个G的文本.从N个这样的文件中得到一个列表, ...

  7. 【每日Scrum】第八天冲刺

    一.计划会议内容 继续昨天的设计 二.任务看板 任务看板 已完成:登录与个人界面布局实现 进行中:UI设计美化,,地图主界面 待进行:功能整合,连接数据库 三.scrum讨论照片 四.产品的状态 无 ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 排序

    从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回 ...

  9. JavaScript—面向对象 贪吃蛇_2 游戏对象

    游戏对象 function Game(map) { this.map = map; this.food = new Food(this.map) this.snake = new Snake(this ...

  10. C语言-再论指针与数组

    指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3 ...