NSU-1241-麦森数
来源:互联网 发布:红包修改金额软件 编辑:程序博客网 时间:2024/05/14 15:02
这个题是个高精度题,要求求2的k次方-1的后500位,不足的用0补,另外还要求计算2的k次方-1的位数。
首先求位数可用公式进行计算,公式为n=k*log(10)2.0+1;
然后写个高精度计算即可,最后只是需要注意换行的问题。
这里分2种情况进行换行:
1、当i%25==0的时候刚好是100位,因为每个数组我们存的4位。
2、当i%25==12的时候,由1我们知道对于100的情况我们已经处理过,剩下的就只有当50*n(当n为奇数的情况需要处理),我们可以知道50%4=2,150%4=2,都以2作为余数,所以这里我们需要进行一个人为的分割操作,而我们知道为奇数的时候它最后2位总是48,所以我们可以将公式转换为4*i%50==48,这样就比较明显的得到当n为奇数的情况
代码:
#include<cstdio>#include<cstring>#include<cmath>#define Mod 10000void mult(int a[],int b[]){ int c[126]; memset(c,0,sizeof(c)); for(int i=0;i<125;i++) {int arry=0;for(int j=0;j<125-i;j++){ int ita=c[i+j]+a[i]*b[j]+arry; arry=ita/Mod; c[i+j]=ita%Mod;} } memcpy(a,c,125*sizeof(int));}int main(){ int n; while(scanf("%d",&n)!=EOF) {int ans=(int)n*log10(2.0)+1;printf("%d\n",ans);int a[126],b[126];memset(a,0,sizeof(a));memset(b,0,sizeof(b));a[0]=1;b[0]=2;while(n){ if(n&1)mult(a,b); mult(b,b); n>>=1;}a[0]--;for(int i=124;i>=0;i--){ if(i%25==12)printf("%02d\n%02d",a[i]/100,a[i]%100); else {printf("%04d",a[i]);if(i%25==0) printf("\n"); }} } return 0;}
- NSU-1241-麦森数
- NSU-1191-Compound Words
- NSU-1245-火星人
- Nsu-1467-VIJOS-P1164
- NSU-1596-VIJOS-P1406
- NSU-1483-口袋的天空
- 在线刷机详细教程(图文)〓诺基亚——NSS修改CODE+NSU升级
- 麦森数
- 麦森数
- 麦森数
- 麦森数
- 麦森数
- 麦森数
- 麦森数
- 麦森数
- 麦森数
- 1241
- Noip2003p4 麦森数
- SOA
- Hello! in Java
- Cent OS 安装 opencv 2.4.4 人脸识别 linux
- Ubuntu12.04手动创建应用程序图标
- 超星 CAJ 转PDF 的问题
- NSU-1241-麦森数
- 每个程序员都应该了解的内存知识
- oracle的文件编辑器问题: SP2-0110: 无法创建保存文件 "afiedt.buf"
- 谁在使用我的网站——用户忠诚和价值分析
- 怎样在Windows7始终以管理员身份运行程序
- Ubuntu建立(apache+php+mysql)+phpmyadmin
- Java程序员必知的8大排序
- Linux操作系统PS命令详细解析(转)
- 用好SELECT索引 提高MySQL查询统计速度