易语言版本:未做太多异常处理,仅演示演算法


template&
constexpr auto res = N % 10 + res&;
template&
constexpr auto res&<0&> = 0;


d 进位,JavaScript,Y组合子版

d =&> n =&> fixed(recur =&> n &< d ? n : (recur(Math.floor(n/d)) + n%d))


如果是字元串,就一位一位取出来加。

如果是数字,那就每次除10取余数,把余数相加。写个简单的思路

Int a = 0;

a += n%10;

n = n /10;

这样循环一下就行了


这样:

def sumOfBits(n:Int) = {
n.toString.map(_.toString.toInt).sum
}


以js为例

var str = String(n)

var res= 0

for(let s of str) {

var l = Number(s)

if(isFinite(l)) res+=l

}

int sum = 0;

for(;n;n/=10) sum += n % 10;


来了来了,python必须要有排面!

def sum_num(n):
"""
计算n的每一位相加求和
:param n: int.
:return: int.
"""
result = 0
for x in str(n):
result += int(x)
return result

print(sum_num(12))

以上!


有很多方法,这里展示一种JAVA方法


while(n&>0){

sum+=n%10;

n/=10;

}

return sum;

分别取出n的每一位 然后相加就好了


数字打成字元串,遍历一遍字元串,加就完了。数字怎么打成字元串方法无数,根据你的语言搜索引擎搜一下


人生苦短,我用python

将字元串转换成列表,遍历列表求和,注意数字类型的转换


这个问题看上去很业余,大神们都用循环啊、模版啊,写了各种语言的版本,附带了各种「小伙子你还年轻「的眼光。

还是有一些大神提出了好问题:「2/8/16/10 ,哪个进位啊?「

啊,不禁让我想起了早年玩过的各种二进位演算法——如果是2/8/16进位的话,是有高速演算法的。思想也很简单——折半。32位数计算2进位数字只需要5步(当然是高级语言,不是指令哈哈哈),没有判断条件的跳出,非常非常流水线,CPU很喜欢。

基本演算法入下,show me the code: 假设输入为X(32位)

// X is the input, assuming `unsigned long`
X = (X0x55555555) + ((X&>&>1)0x55555555)
X = (X0x33333333) + ((X&>&>2)0x33333333)
X = (X0x0F0F0F0F) + ((X&>&>4)0x0F0F0F0F)
X = (X0x00FF00FF) + ((X&>&>8)0x00FF00FF)
X = (X0x0000FFFF) + ((X&>&>16)0x0000FFFF)
// now X is the bits number of original X

好玩吧,不需要除法,木有循环,木有判断,速度奇快。

  • 当然,很容易扩展到 64整数和有符号数
  • 扩展到 8 / 16 进位会稍稍麻烦

聪敏如你,一定可以搞定的,对吧?

ps:听说有的CPU还有专门的计数2进位bit的指令,具体忘光光啦。


这个问题大体分两步。

第一步:如何把每个位数取出来。

第二步:将每个位数相加。

难度主要在第一步,第二步可能只需进行下类型转换即可。

下面详细讲解下第一步:

方法1:利用数学中的位数变换将每位求出。如除十取余得个位;除第一位权值取整得第一位数值等。

方法2:将数字n转换成字元串即字元数组。遍历字元数组将字元类型转换为整数即可。


介绍一种很古老的编程方法:由顶向底逐步求精。

就拿这个题目来说「计算n的每位数字之和」。

翻译翻译,目标是:对给定的一个数字,计算出每一位上面的数字,并把他们累加起来。

经过翻译,我们把目标写成了3句话:

1,需要一个数字

2,计算数字每一位上的数目字(我们大概需要把这些存下来以便累加)

3,把求出来的这些数字累加起来

对于已经给定的数字,我们需要做的步骤是两部:求每位上的数字 累加

累加通常问题不大,这道题的难点基本在于如何求每一位上的数字。把这个问题解觉了,这道编程题基本就解决了。简单能想到的求值方案就俩,大方向一个是把给定数值当做数值型数据来计算(10除取余,具体自己去想和实现),另一个方向是把给定数值当做字元串去处理,从0位置到len - 1位置按位取子字元串转换成数值型再累加。

当做字元串处理没啥意思,通常也不建议初学者这样解决问题。

当然了,写出完整的程序并不是把这个计算方法想明白就成。根据使用的语言不同,编写代码所需要留意的细节也各不相同,自己去联系写出完整的代码,也是对于你掌握这门语言的必要练习。


是几进位的位,二 八 十 还是十六


提供一个思路:

1、转化为字元串

2、遍历字元串,转化为数组

3、求和


这个问题,我用java尝试实现一下吧,不知道你这个n有没有具体限制,下面是源代码,仅供你参考一下:

/**
* 计算传入数n的各个位之和
*
* @param n
* @return
*/
public static int calcSumByN(int n) {
// 给n取绝对值
n = Math.abs(n);
int sum = 0;
do {
// 用n与10取模,获取此时最低位的值,然后与sum相加
sum += n % 10;
// n 整除10,相当于进一位
n = n / 10;
} while (n &>= 10);
sum += n; // 加上最后的最高位
return sum;
}

上面只是一个简单实现,代码中的逻辑已经注释过了,你可以看一下是否满足需求。共同学习,共同进步!


上面的回答太业余了,随便一个用例都跑不了。以工程代码为例,n首先肯定不能假定用户输入的是整数,考虑几种最基本情况:

1.n是小数的情况,例如:n是12.36,那么结果是1+2+3+6 = 12.

2.n是字母的情况,例如12ab34,那么n是1+2 +3+4

3.考虑n是整数,但是存在长度超过32位或者计算机int存储的最大值的情况例如n是1234567899897135145615156189132189156456189...。肯定不能使用int型数据。

考虑以上三种情况,上个C++版本的代码:

运行结果:

这中代码在一般的工业进程可以确保基本没问题。例如:高中以下的数值计算,但是在科学计算中任然需要优化:

例如:

(1)代码中的sum是int类型的,当数值足够长,会越界。那么如果计算量过大,可以考虑int64或者字元串进行存储。

(2)计算效率,当n足够长,时间复杂度是O(N),肯定不合格。


推荐阅读:
相关文章