| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2033 人关注过本帖
标题:求解,高手进
只看楼主 加入收藏
jxt598598
Rank: 1
等 级:新手上路
帖 子:149
专家分:0
注 册:2007-6-13
收藏
得分:0 
回复 6# 的帖子
for(i=0;i<n;++i)
        {
                *(p+i)=(*(p+i)+5);
                if(*(p+i)>=58)    /* 如果ascII码大于数字10*/    为什么这里用ascII码
                        *(p+i)-=10;  /* 当前值减去10 */     这里用整数10
        }
}

qq:304742297
2008-05-19 20:01
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 11# 的帖子
因为数字的ASCII码是48~57,如果现在加后的结果是ASCII的61,那是“=”,我让它减去10,现在的ASCII是51,是数字3,所以就符合题目的要求了。
2008-05-19 23:41
Q1007665007
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-5-16
收藏
得分:0 
干嘛写这么复杂呢?

QQ1007665007
QQ群61762856
2008-05-20 00:01
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
程序代码:
int main()
{
    int n;
    char cs[10];
    gets(cs);  //输入8位数
    for(n=0;cs[n];++n)
        cs[n]+=5*(2*(cs[n]<'5')-1); //加5
    cs[0]^=cs[n-1]^=cs[0]^=cs[n-1];  //交换首位
    for(int i=n;i;--i)
        putchar(cs[i-1]);  //倒序输出
    return 0;
}


~~~~~~~~~~~~~~~~~~

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-20 00:02
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
cs[0]^=cs[n-1]^=cs[0]^=cs[n-1];  //交换首位
这种写法不安全,是未定义的,标准没有承诺赋值一定从右边开始运算。所以还是老老实实地三变量交换吧……当然你如果写开变成三句代码,甚至只是使用逗号操作符,都是可以的。

[[it] 本帖最后由 StarWing83 于 2008-5-20 00:14 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 00:06
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
广陵,建议你看看楼上的代码,体会优化的思想,你看你那么多代码,人家几行就解决了。其中的思想很重要。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 00:07
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
~~~~~~~~~~~~~~`赋值的结合性是从右向左滴

但有可能在右边计算之前先读取左操作数的值

SO

只要等号右边不出现等号左边的数就安全~~~~

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-20 00:14
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
楼上的代码真的太精简了,而且算法很奇妙。
~~~~~~~~~~~
    但我还想说说我的理解:本题意为输出三行,第一行为倒序,第二行为加5,第三行为首尾交换。也许是我的理解有误,所以作出那样的代码。

    另外楼上的代码没有数组位数的限制,很容易溢出,而且输入的时候没有任何提示。虽然这是作题,但如果作成软件的话,操作者是不会知道如何按照程序规定来的。我看过网上的《编写优质无错C》(大概是这个名字)的一些章节,其中有些思想就是要使编出的程序基本无错。试想想,如果这样的代码作成软件,会使多少使用者出现错误?当然,这只是个小帖子,目的是为了作题,但基本上我每写一次代码都会完全考虑到使用者的操作(也许是有些多虑了)。

     楼上的代码很值得我学习,其中的思想也很重要,我会深刻体会思想,学习算法——我也会坚持我的一贯原则,尽量避免使用者由于使用不当造成的错误。
2008-05-20 00:41
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
回复 17# 的帖子
这样的交换是未定义的。我也不多说了,和运算顺序无关,看下面的资料。


3.4 这是个巧妙的表达式: a ?= b ?= a ?= b 它不需要临时变量就可
以交换a 和b 的值。
这不具有可移植性。它试图在序列点之间两次修改变量a, 而这是无定义的。
例如,有人报告如下代码:
int a = 123, b = 7654;
a ^= b ^= a ^= b;
在SCO 优化C 编译器(icc) 下会把b 置为123, 把a 置为0。

[[it] 本帖最后由 StarWing83 于 2008-5-20 14:58 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 02:20
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
再给出一段资料:
3.5 我可否用括号来强制执行我所需要的计算顺序?
一般来讲, 不行。运算符优先级和括弧只能赋予表达是计算部分的顺序. 在如
下的代码中
f() + g() * h()
尽管我们知道乘法运算在加法之前, 但这并不能说明这三个函数哪个会被首
先调用。
如果你需要确保子表达式的计算顺序, 你可能需要使用明确的临时变量和独
立的语句。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 02:21
快速回复:求解,高手进
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045701 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved