华师大 OJ 3031
题目链接:点击打开链接
值得一提的是,我觉得这道题目是我第一次完全靠自己的力量,按照数据结构的思路做出来的。
其实换成数据结构+算法的思路在用C语言来解决问题还是能简化思考的复杂度。
因为人的脑子很笨,无法一下子解决一团问题,需要将其分解。
那么设计好这里的数据结构,其实运行在数据结构上的算法也是非常的重要的。正是有了那些小小的配套的方法,才让思考的过程显得格外的清晰。
解决方案
/******************************************************************************/
/* */
/* DON'T MODIFY main() function anyway! */
/* */
/******************************************************************************/
#include <stdio.h>
#include <string.h>
//把个位数放在v[0],十位数放在v[1]
//特殊数据:数据0,表示为{0,{0}},
typedef struct {int cnt;int v[101];
} BIGINT;void solve(); /* write function solve() to process one case of the problem */
void init(){}
void ADD01(BIGINT *n,int bin);
void MUL2(BIGINT *n);
void DIV2(BIGINT * n);int main()
{ int i,t; init();scanf("%d\n",&t);for (i=0;i<t;i++){ printf("case #%d:\n",i);solve();}return 0;
}//1. 十进制n-->二进制数bin
//2. 二进制bin倒置-->binReverse
//3. binReverse-->倒置
//要自己设计大整数类型void solve(){ //10char str[102];int bin[334];int countBin;int flag;BIGINT n;int i;scanf("%s",str);if(strlen(str)==1 && str[0] == '0'){ printf("0\n");return;}for(i=0;i<strlen(str);i++){n.v[i] = str[strlen(str) - 1 -i]-'0';}n.cnt = strlen(str);countBin = 0;while(n.cnt>0){bin[countBin++] = n.v[0] % 2; //bin[0]存放的是原本的二进制的最低位DIV2(&n); //bin一共有countBin个二进制位,位bin[0],bin[1],...,bin[countBin-1]}flag = 0;for(i=0;i < countBin;i++){if(bin[i] != 0) break;}flag = countBin-1;while(flag){if(bin[flag]!=0){break;}else flag--;}for(;i <=flag ;i++){MUL2(&n);ADD01(&n,bin[i]);}for(i=0;i<n.cnt-1;i++){printf("%d",n.v[n.cnt - 1 - i]);}printf("%d\n",n.v[n.cnt - 1 - i]);
}//大整数加0 or 1
//大整数乘以2
//大整数除以2void ADD01(BIGINT *n,int bin){int i;int t;int carry;if(bin!=0){ //bin == 1if(n->cnt == 0) n->cnt=1,n->v[0] = 1;else{carry = bin;for(i=0;i < n->cnt; i++){t = n->v[i] + carry;n->v[i] = t % 10;carry = t / 10;}if(carry>0){n->v[n->cnt++] = carry;}}}
}void MUL2(BIGINT *n){int i;int t;int carry;if(n->cnt != 0){carry = 0;for(i=0;i<n->cnt;i++){t = n->v[i] * 2 + carry;n->v[i] = t % 10;carry = t / 10;}if(carry>0){n->v[n->cnt++] = carry;}}
}void DIV2(BIGINT * n){ // {2,{3,4} }int i;int t;int cnt = n->cnt;int carry;if(n->v[n->cnt-1] == 1){carry = 1;n->cnt--;} else{t = n->v[n->cnt-1];n->v[n->cnt-1] = t / 2;carry = t % 2;}for(i=cnt-2;i>=0;i--){t = ( n->v[i] + carry*10 );n->v[i] = t / 2;carry = t % 2;}
}
华师大 OJ 3031相关推荐
- 华师大 OJ 2822
题目链接:点击打开链接 这个OJ平台很傻,输出的时候,在一行的末尾少输出一个空格都可能会出错的. 代码 #include <stdio.h> #include <stdlib.h&g ...
- 华师大 OJ 3040
题目描述:点击打开链接 这道题目还是一样的方法.使用分布的思想方法就可以了. 代码: #include <stdio.h> #include <stdlib.h> #inclu ...
- 华师大 OJ 3053
题目链接:点击打开链接 这里要注意的是 1. long long 类型应该怎么输出 2. 题目的意思要准确地理解,有可能会出现11111111,这种边界情况,这个时候,这是要按照2进制来做的.所以要另 ...
- 华师大 OJ 3055
题目描述:点击打开链接 值得一提的是,对这里的题目描述要理解准确. #include <stdio.h> #include <stdlib.h> #include <st ...
- 华师大 OJ 3026
题目链接:点击打开链接 这个题目做了2个小时.这些代码的确是值得学习借鉴的. 解决方案: #include <string.h> #include <stdio.h>void ...
- 华师大 OJ 2897
题目描述:点击打开链接 值得一提的是:需要把这个用来输出的字符串最后手动补上一个0, tmp[count]='\0'; 解决方法: #include <stdio.h> #include ...
- 华师大 OJ 3024
题目描述:点击打开链接 值得一提的是,抽象数据类型定义好,然后把函数实现好. 解决代码: /****************************************************** ...
- 华师大 OJ 2850
题目描述:点击打开链接 这个是真的简单 解决方案: #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- 华师大 OJ 3023
题目描述:点击打开链接 值得一提的是:这个问题调用了递归的方法来解决问题 另外,一开始的时候,我在cmp_char里面直接使用了return strcmp(*((char*)a),*((char*)b ...
最新文章
- python获取天气分析_Python爬取南京市往年天气预报,使用pyecharts进行分析
- SOC(网络安全管理平台)
- 为什么比尔盖茨,马斯克、霍金都提醒你:要警惕人工智能?(上)
- python numpy官网_Python Numpy 教程(上)
- java 使用.aar_java - 使用grad解析aar库的传递依赖性
- linux android gradle构建机器 error while loading shared libraries: libz.so.1: cannot open shared object
- 西澳大学商科专业排名_澳洲西澳大学优势专业排名多少
- swarm 本地管理远程_带有WildFly Swarm的远程JMS
- linux查看php命令目录权限,PHP执行linux命令mkdir权限问题
- prestashop后台如何删除订单
- UML设计(团队作业)
- SubSonic学习(二)
- 基于Java平台实现发送短信功能
- ALG:应用层网关(防火墙)
- 解密Animate.css之CSS3动画实现方式大全源码(6星级)
- python基础_字典_列表_元组考试
- 16个小技巧让你每天都进步(附:提高效率的100条建议)
- for await of使用
- 硬盘质保、保修期网上查询
- Android点9图片被放大的问题