- 浏览: 549554 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
待补充:“浮点数高精度运算”
参见这里==>
大整数四则运算各举例: http://www.cnblogs.com/vongang/archive/2011/08/17/2143303.html
大整数出发还可以参考这里的解释:http://blog.sina.com.cn/s/blog_7393daaf0100sutp.html
当对很大的数(比如100位)进行运算时,肯定不能c/c++内的数据类型直接运算(当然Java里的BigNumber可以。。。)这时就要用数组模拟运算过程。+, - ,*, /,运算貌似是小学学的东西,童鞋们,现在要用到小学的知识啦!!
先说加法,大体的操作包括逆序、对位、求和、进位(其实就是小学的加法运算,不过是把数倒过来算,至于为什么要逆序。。。)
例题:http://poj.grids.cn/practice/2981
代码:
#include <string> #include <iostream> using namespace std; #define MAX 200 int an1[MAX+10]; int an2[MAX+10]; char s1[MAX+10]; char s2[MAX+10]; /* i.e. s1= "1234" s2= "2345" ans1=0...01234 ans2=0...02345 */ int main() { //1. 输入 scanf("%s", s1); scanf("%s", s2); //2. 求和 int i, j; memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); int len1 = strlen( s1); //strlen(string str)函数 j = 0; for( i = len1 - 1;i >= 0 ; i --) //逆置 an1[j++] = s1[i] - '0'; //char转int的秘密 int len2 = strlen(s2); j = 0; for( i = len2 - 1;i >= 0 ; i --) //逆置 an2[j++] = s2[i] - '0'; len1 = max(len1,len2); for( i = 0;i < len1 ; i ++ ) { an1[i] += an2[i]; //求和 if( an1[i] >= 10 ) //进位 { an1[i] -= 10; an1[i+1] ++; } } //3. 输出 int flag = 0; for (i = len1 ; i >= 0; i--) //输出。注意:从len1开始,∵可能求得的和有一个进位:) { if (flag || an1[i]) //这个判断可以保证:对于有进位和没有进位的情况,都一旦有数字就开始输出 { flag = 1; printf("%d",an1[i]); } } //特殊情况: 和为0仍要输出 if (!flag) { printf("0"); } printf("\n"); system("pause"); return 0; }
减法同加法类似
例题:http://poj.grids.cn/practice/2736
代码:
#include <stdio.h> #include <string.h> #define MAX 100 int ans1[MAX+10]; int ans2[MAX+10]; char s1[MAX+10]; char s2[MAX+10]; /* i.e. s1= "2345" s2= "1111" ans1=0...02345 ans2=0...01111 ==> ans1=0...01234 */ void sub(){ //1. char[]转int[](逆序) int len1=strlen(s1); int len2=strlen(s2); memset(ans1,0,sizeof(ans1)); memset(ans2,0,sizeof(ans2)); int i; for(i=0;i<len1;i++){ ans1[len1-1-i]=s1[i]-'0'; } for(i=0;i<len2;i++){ ans2[len2-1-i]=s2[i]-'0'; } //2. 求差 (从低位减起,不够借位) //注意:∵s1>s2,∴len1>=len2 for(i=0;i<len1;i++){ ans1[i]-=ans2[i]; if(ans1[i]<0){ ans1[i]+=10; ans1[i+1]--; } } //3. 输出差 int flag=0;//是否有至少一个数字输出(只要差不为0,flag最终被置true) for(i=len1-1;i>=0;i--){ if(ans1[i]!=0 || flag==1){ printf("%d",ans1[i]); flag=1; } } if(flag==0) printf("0"); } int main() { int time=0; scanf("%d",&time); while(time-->0){ scanf("%s%s",s1,s2); sub(); printf("\n"); } //system("pause"); return 0; }
乘法同加法类似,不过进位时mod10而不是 -10:
例题:http://poj.grids.cn/practice/2980
代码:
#include <stdio.h> #include <string.h> #define max 200 int an1[max+10]; int an2[max+10]; int result[max*2+10]; char s1[max+10]; char s2[max+10]; int main() { gets(s1); gets(s2); int i, j; memset(an1,0,sizeof(an1)); memset(an2,0,sizeof(an2)); memset(result,0,sizeof(result)); int len1 = strlen(s1); j = 0; for(i = len1-1; i >= 0; i--) an1[j++] = s1[i] - '0'; int len2 = strlen(s2); j = 0; for(i = len2-1; i >= 0; i--) an2[j++] = s2[i] - '0'; //遍历两个乘数的位置,每个位置乘积都暂不做进位处理 for(i = 0; i < len2; i++) for(j = 0; j < len1; j++) result[i+j] += an2[i]*an1[j]; //算完后,统一进行进位处理 for(i = 0; i < len1*len2; i++) { if(result[i] >= 10) { result[i+1] += result[i]/10; result[i] %= 10; } } int flag = 0; for(i = len1*len2; i >= 0; i--) { if(flag) printf("%d",result[i]); else if(result[i]) { printf("%d",result[i]); flag = 1; } } if(!flag) printf("0"); printf("\n"); return 0; }
除法:
除法可以看作是循环相减,不过在做减法之前有一个判断两数大小的操作;
还是例题:http://poj.grids.cn/practice/2737
代码:
#include <stdio.h> #include <string.h> #define max 200 char s1[max + 10]; char s2[max + 10]; int an1[max + 10]; int an2[max + 10]; int result[max + 10]; /* 尝试a-=b,如果不够减则不减(我称之为“试差”)。返回 a-b(差)的长度. 注: 当 a<b时,返回-1. 当 a=b时,返回0. 当 a>b时,返回差的长度. */ int jianfa(int a[], int b[], int len1, int len2){ int i; if(len1 < len2) //----------以下判断大小------------- return -1; //a<b int flag = 0; if(len1 == len2){ for(i = len1 - 1; i >= 0; i--){ if(a[i] > b[i]) flag = 1; else if(a[i] < b[i]){ if(!flag) return -1; //a<b } } } //-------------以上判断大小------------- for(i = 0; i < len1; i++)//减法 { a[i] -= b[i]; if(a[i] < 0){ a[i] += 10; a[i+1]--; } } for(i = len1 - 1; i >= 0; i--) if(a[i]) return i+1; return 0; } int main() { int i, j, n; scanf("%d",&n); while(n--) { scanf("%s",s1); scanf("%s",s2); memset(an1, 0, sizeof(an1)); memset(an2, 0, sizeof(an2)); memset(result, 0, sizeof(result)); int len1 = strlen(s1); j = 0; for(i = len1 - 1; i >= 0; i--) an1[j++] = s1[i] - '0'; int len2 = strlen(s2); j = 0; for(i = len2 - 1; i >= 0; i--) an2[j++] = s2[i] - '0'; //1. “试差”一次 /* 为什么先要试差一次,然后再去按照传统手算试商呢: i.e. 求 68/32商: 68-32-32-...反复尝试减即可 i.e. 求 680/32商 680-320-320-...反复尝试减 40-32-32-...反复尝试减 i.e. 求 10/32商 10-?-?-... ==> 哈哈,原来是因为当“被除数 < 除数”的情况 ,试商(循环试差)根本无从试起,所以一上来先要减去被除数试试看,如果>0则知道可以开展试商。 下面代码中的注解以 "2345/32"为例 , 2345-32=2313>0,可以开展试商。 (1)第一轮试商,2313尝试循环减去 3200(后面补的0的个数是 len(2345-32)=4得到的),可惜发现不够减 ==>本轮剩下2313 (2313-0*3200) (2)第二轮试商,2313尝试循环减去320(3200去掉一个0),可以减去7次 ==> 本轮剩下73 (2313-7*320) (3)第三轮试商,73尝试循环减去32(320去掉一个0),可以减去2次 ==> 本轮剩下9(73-2*32) (4)9已经是余数了。收工:) */ if(len1 < len2) { printf("0\n"); continue; } len1 = jianfa(an1, an2, len1, len2); //2345-32=2313 --> len1=4位 if(len1 < 0) { printf("0\n"); continue; }else if(len1 == 0) { printf("1\n"); continue; } result[0]++; //减掉一次,商加1 //减去一次后结果的长度是len1 int n = len1 - len2; //len1-len2=len(2313)-len(32)=4-2=2 if(n < 0) //不能再减时,诸如35/32的情况,减去一次后len1-len2=len(3)-len(32)=1-2=-1 <0 { //处理进位 (后面有一段与此完全一样的代码) for(i = 0;i < max; i++){ if(result[i] >= 10){ result[i+1] += result[i]/10; result[i] %= 10; } } }else if(n > 0){ //还可以减,诸如 2345/32的情况,减去一次后 len1-len2=len(2313)-len(32)=4-2=2 >0 for(i = len1 - 1; i >= 0; i--){ //i=3,2,1,0 ; an2[]=32 if(i >= n) an2[i] = an2[i-n]; else an2[i] = 0; } //结束时,an2[]=3200 } //2. 反复试商(循环试差) len2 = len1; //an2[]=3200; len2=len1=len(2313)=4 for(j = 0; j <= n; j++){ //尝试算出 //j=0, result[n] , t=jianfa(an1, an2+0, len1, len-0) , an1=2313尝试循环减去 an2=3200 ==> t=-1(不够减) ,直接跳到下一次循环 //j=1, result[n-1] , t=jianfa(an1, an2+1, len1, len-1) , an2=2313尝试循环减去 an2=320 ==> 减了7次 ,退出while时, result[n-1]=7 // ... //j=n, result[0] , t=jianfa(an1, an2+n, len1, len-n) , an2=73尝试循环减去 an2=32 ==> 减了2次 ,退出while时, result[0]=2 int t; while((t = jianfa(an1, an2+j, len1, len2-j)) >= 0){ //int jianfa(int a[], int b[], int len1, int len2) // an2+j 表示把数组的头指针向后移j个位置,即删掉j个an2补上的0 // len2 同时减小j len1 = t; result[n-j]++; } } //处理进位 for(i = 0;i < max; i++)//进位 { if(result[i] >= 10) { result[i+1] += result[i]/10; result[i] %= 10; } } //输出商 int flag = 0; for(i = max; i >= 0; i--)//输出 if(flag) printf("%d",result[i]); else if(result[i]) { printf("%d",result[i]); flag = 1; } if(!flag) printf("0\n"); printf("\n"); } return 0; }
发表评论
-
快排备忘
2013-10-26 11:27 613http://hi.baidu.com/pluto455988 ... -
LRU简单实现C++
2013-10-17 10:52 4073页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页 ... -
二叉树相关
2013-10-04 17:40 742本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针 ... -
双指针策略(《编程之美》3.5 最短摘要生成)
2013-03-26 15:17 2274本文源自《编程之美》3.5 最短摘要生成一课。 ... -
K-MEDOIDS聚类算法
2012-12-04 21:18 2026k-medoids聚类算法 (wiki上讲得很清楚啊:) ) ... -
搜索(三)——回溯
2012-11-23 15:23 1073一、回溯 和 深度搜索 ... -
哈希Hash
2012-11-21 14:42 1025要点一:哈希表长度 的确定是个两难的问题:太短则容 ... -
状态压缩DP
2012-11-14 20:27 784引例、 例1、 例2、 例3、 ... -
模拟退火
2012-10-28 16:34 1255引用:http://www.cnblogs.com/heaad ... -
计算几何(一)——基础算法
2012-07-12 21:07 1951待续 《计算几何资料》为提纲 1. (1) 有向线段 ... -
计算几何(二)——平面最近点对
2012-07-12 10:54 939参考资料: 为何这个问题采用分治法 http://blog ... -
气泡滚大——剔除线性数据中的杂质
2012-06-18 09:43 999这是一道Java的面试题,但是我总结了除了一种自称为“ ... -
深入理解二分查找(二、二分答案)
2012-04-29 16:24 7235二分答案 如果已知候选答案的范围[min,max ... -
P问题、NP问题和NPC问题
2012-04-25 16:36 1105这篇文章转自这里 ... -
RMQ(Range Minimum/Maximum Query)区间最值查询
2012-04-18 20:47 1617一、RMQ问题描述 和 几种解题思路 RMQ问题 (Rang ... -
后缀数组
2012-04-16 09:49 1572一、后缀数组 及其对应的名次数组 举例:S=&quo ... -
单向链表相关
2012-04-10 16:42 1022单向链表是微软笔试常考的,参考这里:http://www.c ... -
关键路径(AOE)
2012-04-10 08:05 1707前面这段话是引用别人的,后面代码是自己写的,有待完善: ... -
搜索(二)——双向BFS
2012-03-24 17:18 3069参考这篇文章,以下前 ... -
搜索(一)——剪枝
2012-03-24 11:46 1584参考文档:《搜索方法 ...
相关推荐
这个项目的核心目标是创建一个能够处理超过普通整型范围的大整数运算的计算器。以下是这个项目涉及的一些关键知识点: 1. **C++编程基础**:C++是一种强大且灵活的面向对象编程语言,适用于系统软件、应用程序、...
4. 运动错误和处理方法:针对控制器在运动控制过程中可能产生的各种错误,如位置偏差过大、速度不匹配等,提供了详细的诊断步骤和解决办法。 5. 附录:包含了对控制器的硬件配置、参数设定、模块连接等详细技术信息...
C库是C语言编程时必不可少的一部分,它包含了众多的函数,如数学运算、字符串处理、输入/输出操作等。对于ARM裸奔程序来说,最常用的C库之一是Newlib,这是一个轻量级且高度优化的C库,专门为资源有限的嵌入式系统...
1. 数据操作指令:处理基本数据类型的运算,如IADD(整数加法)。 2. 操作数栈管理指令:控制栈顶元素的操作,如POP(弹出栈顶元素)。 3. 控制流指令:改变执行流程,如GOTO(无条件跳转)、IF_ICMPEQ(比较两个...
小学数学教师解题比赛中涉及到的知识点广泛,涵盖了基础数学的各种概念和运算,下面将逐一解析题目及答案,以便深入理解: 1. 计算:原式等于1,这是通过简化分数得出的结论。 2. 所有个位数和十位数都是奇数的两位...
- **解析**: 32位整型变量在大多数计算机体系结构中占用4个字节的空间,这是因为32位可以表示从0到2^32-1的整数范围。 ### 4. 等价的赋值语句 - **知识点**: 题目中的循环体为`s=s-1`,执行了`c`次。等价的赋值语句...
(此为本人从CSDN上转载,因前半部分解决了偶的问题,故觉得有些价值,特此奉上。) 在matlab中,我们常使用imshow,我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内...
怎么写字符串和数字 217 1.1.1 字符串 217 1.1.2 数字 219 1.1.3 十六进制值 219 1.1.4 NULL值 219 1.1.5 数据库、表、索引、列和别名的命名 220 1.1.5.1 名字的大小写敏感性 221 1.2 用户变量...
怎么写字符串和数字 217 1.1.1 字符串 217 1.1.2 数字 219 1.1.3 十六进制值 219 1.1.4 NULL值 219 1.1.5 数据库、表、索引、列和别名的命名 220 1.1.5.1 名字的大小写敏感性 221 1.2 用户变量...