输入二进制数,输出与之对应的十进制
(思路:因为不能直接让计算机将我输入的数字当做二进制数,所以只能输入一个伪二进制的十进制数,比如10101,然后一位一位的拆解,同时给它们换座位(本来是乘十的就成2,乘100的就乘4,依次类推….最后再加起来。
整个的步骤可以总结为:除权拆解,加权重组。)
# include <stdio.h>
#include <math.h>
void main(){
int k = 1,m = 1,n = 1, i = 1,x = 1,y = 1,j = 1,sum = 0;
printf("任意输入一位二进制数: ");
scanf("%d",&i);
getchar();
for( n = 0;i/k >0;n++){
k *= 10;
}
printf("\n您输入的二进制数总共有: %d位",n);
for(j = n - 1;j >= 0;j--){
x = pow(2,j);
y = pow(10,j);
sum += (i/y)*x;
i = i%y;
}
printf("\n\n它对应的十进制数是: %d",sum);
getchar();
}
待优化的部分:
当输入的数字不是二进制类型时要求重新输入。
这都不是关键,关键是用递归做……算法知道,边界清楚,调用自身我也OK,难点在返回值的部分如何写。
———–懵与懂的分界线———–
首先感谢李涛同学的代码提示:
//输入一个数,输出它的十进制数,递归做法
#include <stdio.h>
#include <math.h>
void main()
{
int i = 1,n;
int exchange(int n);
printf("输入一个二进制数:\n");
scanf("%d",&n);
getchar();
printf("\n它的十进制数是: %d",exchange(n));
getchar();
exchange(n);
}
int exchange(int x)
{
if(x/10 == 0){
return 1;
}else{
return exchange(x/10)*2+x%10;
}
}
思路:二转十,就是要把二进制数的每一个数都乘以2的N次方,N代表它所在的位置顺序(低位往高位数,从0开始)
算法解释:
比如输入n = 1111
n/10= 111 //干掉最后一位,再作为传参调用。
因为末尾的数已经不能再继续乘2,换句话说末位的加权动作本来就是1*2^0,这一步中已经完成了,所以要把它分离出去,如下:
n%10= 1 //这样最后一位就拆解来了,并且已经完成十进制的转换。
然后返回的值是exchange(n/10)*2+x%10,我自己给这种情况起了一个名字叫“半返回状态”,因为返回值里面有一部分是需要继续实现功能的函数,所以此时数字部分要在这里等候,直到函数正式退出以后再一起返回。这样就可以实现二进制从低往高的每一位都乘以相应的2的幂后再加上被干掉的末尾数。这么说可能很绕。
大概是之前给别人培训做多了,哥最喜欢做的事,就是把复杂的问题讲的形象生动,下面是我的演示:
如果我以后这样讲学生还听不懂,我可能会把他打死!
假设递归调用的函数时t:
输入二进制数a:
111111 //(对应的十进制应该是63)
第一次进入函数:
(a /10)去余 =11111 (作为传参调用)
(a%10)取余 = 1
此时的返回值:t(11111)*2+1 为半返回状态,1不输出,在此等候。
递归模式开启1:
第二次的返回值(a(1111)*2+1)*2+1=a(1111)*4 + 3 递归未结束,为半返回状态,3不输出,在此等候。
第三次的返回值(a(111)*2+1)*4+2+1=a(111)*8 + 7 递归未结束,为半返回状态,7不输出在此等候。
第四次的返回值(a(11)*2+1)*16+4+2+1=a(11)*16 +15 递归未结束,为半返回状态,15不输出,在此等候。
第五次的返回值(a(1)*2+1)*32+16+4+2+1=a(1)*32 +31 = 1*32 + 31 = 63 递归结束,完全返回状态,输出63,走你☞
其实这道题还有别的算法,类似于我自己刚开始的循环算法,也是可以的,不过本人觉得这个算法比较叼,感觉脑洞被撬开了几个,再次感谢李涛。
.
.
今日内容:
1),数组
概念:同一类型的多个元素的集合——数组
结构: int array [5] = {0,1,2,3,4} //[]内数字代表数组的长度
类型 变量名 [大小] = 初始化
两种定义形式:int array[] = {1,2,3,4},int array[4] = {1,2,3,4}.
2),数组初始化,两种方式:
a,直接进行初始化
int array [5] = {0,1,2,3,4}
可以对全部元素赋值,此时可以不用指定数组的长度(还是写上的好,反正不费多大力气)。
上面的代码可以写成:int array[] = {0,1,2,3,4}
如果只给部分元素赋值,则其余元素都为当前类型的默认值:
0(int型) 0.000000(float型) 空(char型);
如果要全部赋值为零,可以写成:int array[] = {0}
b,生僻知识 –下标初始化
array[0] = 1
(前提是已经声明)
一维数组的声明 datatype arrayName [size]
类型说明符 标识符 大小
3),数组的取值
核心:下标取值(下标就是数组元素的顺序,参考JS)
数组是一大片连续的内存空间。
4)不合法定义
5)不能超过数组的边界,否则程序会崩溃。
—-穿插知识点 —
常量定义时define与const的区别:
http://blog.csdn.net/feng200950080206/article/details/7601988
C语言数组冒泡排序法:
好大一个坑,C语言的数组不能像JS那样直接打印整个数组(至少目前为止是这样),而是需要逐个数组循环打印。千万不能偷懒把打印的动作放在第一个循环里面(虽然它的循环次数正式我们要的),因为这时冒泡还没有结束,会出错,会出错,会出错。
一旦运气不好糊弄过去了,就掉的大。比如下面两个数组,用之前错误的方法进行冒泡排序,a可以糊弄过去,b就会发现问题。
a = [1,2,9,4,7,3,12,34,17,22]
b = [11,1,4,56,34,32,434,57,3,12]
#include<stdio.h>
void main(){
int i = 0,j = 0;
int a[10] = {11,1,4,56,34,32,434,57,3,12};
printf("升序排列:\n");
for(i = 0;i <10;i++){
for(j = 1;j<10;j++){
if(a[j] < a[j-1]){
a[j] = a[j] + a[j-1];
a[j-1] = a[j] - a[j-1];
a[j] = a[j] - a[j-1];
}
}
}
for(i = 0;i <10;i++ ){
printf("%d\t",a[i]);
getchar();
}
}
遗留问题:输入5个数,形成数组,再输入一个数,判断数组中是否有元素与之相同,利用函数,返回是或否。
JSON 与XML:
两者的共同优点是都是文本表示的数据格式,可以跨平台、跨系统交换数据。
可读性和可扩展性:,JSON和XML不相上下。
编码难度:JSON略比XML简单,要写好XML最好还是借助XML编辑器,标签的嵌套和配对手动输入来说容易出错。因此,从代码的可维护性角度而言,JSON优于XML。
内容解析:JSON在客户端只要使用eval()便可完成解析,在服务器端有包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言的解析支持,非常简单;而XML则相对复杂,不管在服务器端还是在客户端都需要花费大量的代码来实现解析。
数据表示和传输性能:JSON明显比XML简洁,格式简单,占用带宽少。
安全性:由于大部分Javascript库都是使用eval()来解析数据,存在执行恶意JSON数据的安全漏洞;当然可以使用专门的JSON解析器来避免这个问题。相比,XML更安全一些。
XML
优点:
1. 格式统一, 符合标准
2. 容易与其他系统进行远程交互, 数据共享比较方便
3.调用将 XML 用作传输的现有服务。
4.使用 XSLT 可以动态转换 XML。这是企业服务总线 (ESB) 方案中的理想功能。
缺点:
1. XML文件格式文件庞大, 格式复杂, 传输占用带宽
2. 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护
3. 客户端不同浏览器之间解析XML的方式不一致, 需要重复编写很多代码 4. 服务器端和客户端解析XML花费资源和时间
JSON
优点:
1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小,浏览器解析快
2. 易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行JSON数据的读取
3. 构造友好,支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析
4. 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取.
5. 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护 6.相当稳定。JSON 的附加内容将成为超集。
缺点:
1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML
那么通用性
2. JSON格式目前在Web Service中推广还属于初级阶段。