给定一个数字n,求从1到n的所有数字的数字之和。 例如:
null
Input: n = 5Output: Sum of digits in numbers from 1 to 5 = 15Input: n = 12Output: Sum of digits in numbers from 1 to 12 = 51Input: n = 328Output: Sum of digits in numbers from 1 to 328 = 3241
天真的解决方案: 一个简单的解决方案是遍历从1到n的每个数字x,并通过遍历x的所有数字来计算x中的和。下面是这个想法的实现。
C++
// A Simple C++ program to compute sum of digits in numbers from 1 to n #include<bits/stdc++.h> using namespace std; int sumOfDigits( int ); // Returns sum of all digits in numbers from 1 to n int sumOfDigitsFrom1ToN( int n) { int result = 0; // initialize result // One by one compute sum of digits in every number from // 1 to n for ( int x = 1; x <= n; x++) result += sumOfDigits(x); return result; } // A utility function to compute sum of digits in a // given number x int sumOfDigits( int x) { int sum = 0; while (x != 0) { sum += x %10; x = x /10; } return sum; } // Driver Program int main() { int n = 328; cout << "Sum of digits in numbers from 1 to " << n << " is " << sumOfDigitsFrom1ToN(n); return 0; } |
JAVA
// A Simple JAVA program to compute sum of // digits in numbers from 1 to n import java.io.*; class GFG { // Returns sum of all digits in numbers // from 1 to n static int sumOfDigitsFrom1ToN( int n) { int result = 0 ; // initialize result // One by one compute sum of digits // in every number from 1 to n for ( int x = 1 ; x <= n; x++) result += sumOfDigits(x); return result; } // A utility function to compute sum // of digits in a given number x static int sumOfDigits( int x) { int sum = 0 ; while (x != 0 ) { sum += x % 10 ; x = x / 10 ; } return sum; } // Driver Program public static void main(String args[]) { int n = 328 ; System.out.println( "Sum of digits in numbers" + " from 1 to " + n + " is " + sumOfDigitsFrom1ToN(n)); } } /*This code is contributed by Nikita Tiwari.*/ |
Python3
# A Simple Python program to compute sum # of digits in numbers from 1 to n # Returns sum of all digits in numbers # from 1 to n def sumOfDigitsFrom1ToN(n) : result = 0 # initialize result # One by one compute sum of digits # in every number from 1 to n for x in range ( 1 , n + 1 ) : result = result + sumOfDigits(x) return result # A utility function to compute sum of # digits in a given number x def sumOfDigits(x) : sum = 0 while (x ! = 0 ) : sum = sum + x % 10 x = x / / 10 return sum # Driver Program n = 328 print ( "Sum of digits in numbers from 1 to" , n, "is" , sumOfDigitsFrom1ToN(n)) # This code is contributed by Nikita Tiwari. |
C#
// A Simple C# program to compute sum of // digits in numbers from 1 to n using System; public class GFG { // Returns sum of all digits in numbers // from 1 to n static int sumOfDigitsFrom1ToN( int n) { // initialize result int result = 0; // One by one compute sum of digits // in every number from 1 to n for ( int x = 1; x <= n; x++) result += sumOfDigits(x); return result; } // A utility function to compute sum // of digits in a given number x static int sumOfDigits( int x) { int sum = 0; while (x != 0) { sum += x % 10; x = x / 10; } return sum; } // Driver Program public static void Main() { int n = 328; Console.WriteLine( "Sum of digits" + " in numbers from 1 to " + n + " is " + sumOfDigitsFrom1ToN(n)); } } // This code is contributed by shiv_bhakt. |
PHP
<?php // A Simple php program to compute sum //of digits in numbers from 1 to n // Returns sum of all digits in // numbers from 1 to n function sumOfDigitsFrom1ToN( $n ) { $result = 0; // initialize result // One by one compute sum of digits // in every number from 1 to n for ( $x = 1; $x <= $n ; $x ++) $result += sumOfDigits( $x ); return $result ; } // A utility function to compute sum // of digits in a given number x function sumOfDigits( $x ) { $sum = 0; while ( $x != 0) { $sum += $x %10; $x = $x /10; } return $sum ; } // Driver Program $n = 328; echo "Sum of digits in numbers from" . " 1 to " . $n . " is " . sumOfDigitsFrom1ToN( $n ); // This code is contributed by ajit ?> |
Javascript
<script> // A Simple Javascript program to compute sum of // digits in numbers from 1 to n // Returns sum of all digits in numbers // from 1 to n function sumOfDigitsFrom1ToN(n) { // initialize result let result = 0; // One by one compute sum of digits // in every number from 1 to n for (let x = 1; x <= n; x++) result += sumOfDigits(x); return result; } // A utility function to compute sum // of digits in a given number x function sumOfDigits(x) { let sum = 0; while (x != 0) { sum += x % 10; x = parseInt(x / 10, 10); } return sum; } let n = 328; document.write( "Sum of digits" + " in numbers from 1 to " + n + " is " + sumOfDigitsFrom1ToN(n)); // This code is contributed by divyeshrabadiya07. </script> |
输出:
Sum of digits in numbers from 1 to 328 is 3241
高效的解决方案: 以上是一个天真的解决方案。我们可以通过找到一种模式来更有效地实现这一点。 让我们举几个例子。
sum(9) = 1 + 2 + 3 + 4 ........... + 9 = 9*10/2 = 45sum(99) = 45 + (10 + 45) + (20 + 45) + ..... (90 + 45) = 45*10 + (10 + 20 + 30 ... 90) = 45*10 + 10(1 + 2 + ... 9) = 45*10 + 45*10 = sum(9)*10 + 45*10 sum(999) = sum(99)*10 + 45*100
一般来说,我们可以计算总和(10 D –1)使用以下公式
sum(10d - 1) = sum(10d-1 - 1) * 10 + 45*(10d-1)
在下面的实现中,使用 动态规划 因为有重叠的子问题。 上述公式是这个想法的核心步骤之一。下面是完整的算法
算法:求和(n)
1) Find number of digits minus one in n. Let this value be 'd'. For 328, d is 2.2) Compute some of digits in numbers from 1 to 10d - 1. Let this sum be w. For 328, we compute sum of digits from 1 to 99 using above formula.3) Find Most significant digit (msd) in n. For 328, msd is 3.4) Overall sum is sum of following terms a) Sum of digits in 1 to "msd * 10d - 1". For 328, sum of digits in numbers from 1 to 299. For 328, we compute 3*sum(99) + (1 + 2)*100. Note that sum of sum(299) is sum(99) + sum of digits from 100 to 199 + sum of digits from 200 to 299. Sum of 100 to 199 is sum(99) + 1*100 and sum of 299 is sum(99) + 2*100. In general, this sum can be computed as w*msd + (msd*(msd-1)/2)*10d b) Sum of digits in msd * 10d to n. For 328, sum of digits in 300 to 328. For 328, this sum is computed as 3*29 + recursive call "sum(28)" In general, this sum can be computed as msd * (n % (msd*10d) + 1) + sum(n % (10d))
下面是上述算法的实现。
C++
// C++ program to compute sum of digits in numbers from 1 to n #include<bits/stdc++.h> using namespace std; // Function to computer sum of digits in numbers from 1 to n // Comments use example of 328 to explain the code int sumOfDigitsFrom1ToN( int n) { // base case: if n<10 return sum of // first n natural numbers if (n<10) return n*(n+1)/2; // d = number of digits minus one in n. For 328, d is 2 int d = log10 (n); // computing sum of digits from 1 to 10^d-1, // d=1 a[0]=0; // d=2 a[1]=sum of digit from 1 to 9 = 45 // d=3 a[2]=sum of digit from 1 to 99 = a[1]*10 + 45*10^1 = 900 // d=4 a[3]=sum of digit from 1 to 999 = a[2]*10 + 45*10^2 = 13500 int *a = new int [d+1]; a[0] = 0, a[1] = 45; for ( int i=2; i<=d; i++) a[i] = a[i-1]*10 + 45* ceil ( pow (10,i-1)); // computing 10^d int p = ceil ( pow (10, d)); // Most significant digit (msd) of n, // For 328, msd is 3 which can be obtained using 328/100 int msd = n/p; // EXPLANATION FOR FIRST and SECOND TERMS IN BELOW LINE OF CODE // First two terms compute sum of digits from 1 to 299 // (sum of digits in range 1-99 stored in a[d]) + // (sum of digits in range 100-199, can be calculated as 1*100 + a[d] // (sum of digits in range 200-299, can be calculated as 2*100 + a[d] // The above sum can be written as 3*a[d] + (1+2)*100 // EXPLANATION FOR THIRD AND FOURTH TERMS IN BELOW LINE OF CODE // The last two terms compute sum of digits in number from 300 to 328 // The third term adds 3*29 to sum as digit 3 occurs in all numbers // from 300 to 328 // The fourth term recursively calls for 28 return msd*a[d] + (msd*(msd-1)/2)*p + msd*(1+n%p) + sumOfDigitsFrom1ToN(n%p); } // Driver Program int main() { int n = 328; cout << "Sum of digits in numbers from 1 to " << n << " is " << sumOfDigitsFrom1ToN(n); return 0; } |
JAVA
// JAVA program to compute sum of digits // in numbers from 1 to n import java.io.*; import java.math.*; class GFG{ // Function to computer sum of digits in // numbers from 1 to n. Comments use // example of 328 to explain the code static int sumOfDigitsFrom1ToN( int n) { // base case: if n<10 return sum of // first n natural numbers if (n < 10 ) return (n * (n + 1 ) / 2 ); // d = number of digits minus one in // n. For 328, d is 2 int d = ( int )(Math.log10(n)); // computing sum of digits from 1 to 10^d-1, // d=1 a[0]=0; // d=2 a[1]=sum of digit from 1 to 9 = 45 // d=3 a[2]=sum of digit from 1 to 99 = // a[1]*10 + 45*10^1 = 900 // d=4 a[3]=sum of digit from 1 to 999 = // a[2]*10 + 45*10^2 = 13500 int a[] = new int [d+ 1 ]; a[ 0 ] = 0 ; a[ 1 ] = 45 ; for ( int i = 2 ; i <= d; i++) a[i] = a[i- 1 ] * 10 + 45 * ( int )(Math.ceil(Math.pow( 10 , i- 1 ))); // computing 10^d int p = ( int )(Math.ceil(Math.pow( 10 , d))); // Most significant digit (msd) of n, // For 328, msd is 3 which can be obtained // using 328/100 int msd = n / p; // EXPLANATION FOR FIRST and SECOND TERMS IN // BELOW LINE OF CODE // First two terms compute sum of digits from // 1 to 299 // (sum of digits in range 1-99 stored in a[d]) + // (sum of digits in range 100-199, can be // calculated as 1*100 + a[d] // (sum of digits in range 200-299, can be // calculated as 2*100 + a[d] // The above sum can be written as 3*a[d] + // (1+2)*100 // EXPLANATION FOR THIRD AND FOURTH TERMS IN // BELOW LINE OF CODE // The last two terms compute sum of digits in // number from 300 to 328. The third term adds // 3*29 to sum as digit 3 occurs in all numbers // from 300 to 328. The fourth term recursively // calls for 28 return (msd * a[d] + (msd * (msd - 1 ) / 2 ) * p + msd * ( 1 + n % p) + sumOfDigitsFrom1ToN(n % p)); } // Driver Program public static void main(String args[]) { int n = 328 ; System.out.println( "Sum of digits in numbers " + "from 1 to " +n + " is " + sumOfDigitsFrom1ToN(n)); } } /*This code is contributed by Nikita Tiwari.*/ |
Python3
# PYTHON 3 program to compute sum of digits # in numbers from 1 to n import math # Function to computer sum of digits in # numbers from 1 to n. Comments use example # of 328 to explain the code def sumOfDigitsFrom1ToN( n) : # base case: if n<10 return sum of # first n natural numbers if (n< 10 ) : return (n * (n + 1 ) / 2 ) # d = number of digits minus one in n. # For 328, d is 2 d = ( int )(math.log10(n)) """computing sum of digits from 1 to 10^d-1, d=1 a[0]=0; d=2 a[1]=sum of digit from 1 to 9 = 45 d=3 a[2]=sum of digit from 1 to 99 = a[1]*10 + 45*10^1 = 900 d=4 a[3]=sum of digit from 1 to 999 = a[2]*10 + 45*10^2 = 13500""" a = [ 0 ] * (d + 1 ) a[ 0 ] = 0 a[ 1 ] = 45 for i in range ( 2 , d + 1 ) : a[i] = a[i - 1 ] * 10 + 45 * ( int )(math.ceil(math. pow ( 10 ,i - 1 ))) # computing 10^d p = ( int )(math.ceil(math. pow ( 10 , d))) # Most significant digit (msd) of n, # For 328, msd is 3 which can be obtained # using 328/100 msd = n / / p """EXPLANATION FOR FIRST and SECOND TERMS IN BELOW LINE OF CODE First two terms compute sum of digits from 1 to 299 (sum of digits in range 1-99 stored in a[d]) + (sum of digits in range 100-199, can be calculated as 1*100 + a[d]. (sum of digits in range 200-299, can be calculated as 2*100 + a[d] The above sum can be written as 3*a[d] + (1+2)*100 EXPLANATION FOR THIRD AND FOURTH TERMS IN BELOW LINE OF CODE The last two terms compute sum of digits in number from 300 to 328. The third term adds 3*29 to sum as digit 3 occurs in all numbers from 300 to 328. The fourth term recursively calls for 28""" return ( int )(msd * a[d] + (msd * (msd - 1 ) / / 2 ) * p + msd * ( 1 + n % p) + sumOfDigitsFrom1ToN(n % p)) # Driver Program n = 328 print ( "Sum of digits in numbers from 1 to" , n , "is" ,sumOfDigitsFrom1ToN(n)) # This code is contributed by Nikita Tiwari. |
C#
// C# program to compute sum of digits // in numbers from 1 to n using System; public class GFG { // Function to computer sum of digits in // numbers from 1 to n. Comments use // example of 328 to explain the code static int sumOfDigitsFrom1ToN( int n) { // base case: if n<10 return sum of // first n natural numbers if (n < 10) return (n * (n + 1) / 2); // d = number of digits minus one in // n. For 328, d is 2 int d = ( int )(Math.Log(n) / Math.Log(10)); // computing sum of digits from 1 to 10^d-1, // d=1 a[0]=0; // d=2 a[1]=sum of digit from 1 to 9 = 45 // d=3 a[2]=sum of digit from 1 to 99 = // a[1]*10 + 45*10^1 = 900 // d=4 a[3]=sum of digit from 1 to 999 = // a[2]*10 + 45*10^2 = 13500 int [] a = new int [d+1]; a[0] = 0; a[1] = 45; for ( int i = 2; i <= d; i++) a[i] = a[i-1] * 10 + 45 * ( int )(Math.Ceiling(Math.Pow(10, i-1))); // computing 10^d int p = ( int )(Math.Ceiling(Math.Pow(10, d))); // Most significant digit (msd) of n, // For 328, msd is 3 which can be obtained // using 328/100 int msd = n / p; // EXPLANATION FOR FIRST and SECOND TERMS IN // BELOW LINE OF CODE // First two terms compute sum of digits from // 1 to 299 // (sum of digits in range 1-99 stored in a[d]) + // (sum of digits in range 100-199, can be // calculated as 1*100 + a[d] // (sum of digits in range 200-299, can be // calculated as 2*100 + a[d] // The above sum can be written as 3*a[d] + // (1+2)*100 // EXPLANATION FOR THIRD AND FOURTH TERMS IN // BELOW LINE OF CODE // The last two terms compute sum of digits in // number from 300 to 328. The third term adds // 3*29 to sum as digit 3 occurs in all numbers // from 300 to 328. The fourth term recursively // calls for 28 return (msd * a[d] + (msd * (msd - 1) / 2) * p + msd * (1 + n % p) + sumOfDigitsFrom1ToN(n % p)); } // Driver Program public static void Main() { int n = 328; Console.WriteLine( "Sum of digits in numbers " + "from 1 to " +n + " is " + sumOfDigitsFrom1ToN(n)); } } // This code is contributed by shiv_bhakt. |
PHP
<?php // PHP program to compute sum of digits // in numbers from 1 to n // Function to computer sum of digits in // numbers from 1 to n. Comments use // example of 328 to explain the code function sumOfDigitsFrom1ToN( $n ) { // base case: if n<10 return sum of // first n natural numbers if ( $n < 10) return ( $n * ( $n + 1) / 2); // d = number of digits minus one in // n. For 328, d is 2 $d = (int)(log10( $n )); // computing sum of digits from 1 // to 10^d-1, d=1 a[0]=0; // d=2 a[1]=sum of digit from 1 to 9 = 45 // d=3 a[2]=sum of digit from 1 to 99 = // a[1]*10 + 45*10^1 = 900 // d=4 a[3]=sum of digit from 1 to 999 = // a[2]*10 + 45*10^2 = 13500 $a [ $d + 1] = array (); $a [0] = 0; $a [1] = 45; for ( $i = 2; $i <= $d ; $i ++) $a [ $i ] = $a [ $i - 1] * 10 + 45 * (int)( ceil (pow(10, $i - 1))); // computing 10^d $p = (int)( ceil (pow(10, $d ))); // Most significant digit (msd) of n, // For 328, msd is 3 which can be obtained // using 328/100 $msd = (int)( $n / $p ); // EXPLANATION FOR FIRST and SECOND // TERMS IN BELOW LINE OF CODE // First two terms compute sum of // digits from 1 to 299 // (sum of digits in range 1-99 stored // in a[d]) + (sum of digits in range // 100-199, can be calculated as 1*100 + a[d] // (sum of digits in range 200-299, // can be calculated as 2*100 + a[d] // The above sum can be written as // 3*a[d] + (1+2)*100 // EXPLANATION FOR THIRD AND FOURTH // TERMS IN BELOW LINE OF CODE // The last two terms compute sum of digits in // number from 300 to 328. The third term adds // 3*29 to sum as digit 3 occurs in all numbers // from 300 to 328. The fourth term recursively // calls for 28 return ( $msd * $a [ $d ] + ( $msd * (int)( $msd - 1) / 2) * $p + $msd * (1 + $n % $p ) + sumOfDigitsFrom1ToN( $n % $p )); } // Driver Code $n = 328; echo ( "Sum of digits in numbers " ), "from 1 to " , $n , " is " , sumOfDigitsFrom1ToN( $n ); // This code is contributed by Sachin ?> |
Javascript
<script> // Javascript program to compute sum of digits // in numbers from 1 to n // Function to computer sum of digits in // numbers from 1 to n. Comments use // example of 328 to explain the code function sumOfDigitsFrom1ToN(n) { // base case: if n<10 return sum of // first n natural numbers if (n < 10) return (n * (n + 1) / 2); // d = number of digits minus one in // n. For 328, d is 2 let d = parseInt(Math.log(n) / Math.log(10), 10); // computing sum of digits from 1 to 10^d-1, // d=1 a[0]=0; // d=2 a[1]=sum of digit from 1 to 9 = 45 // d=3 a[2]=sum of digit from 1 to 99 = // a[1]*10 + 45*10^1 = 900 // d=4 a[3]=sum of digit from 1 to 999 = // a[2]*10 + 45*10^2 = 13500 let a = new Array(d+1); a[0] = 0; a[1] = 45; for (let i = 2; i <= d; i++) a[i] = a[i-1] * 10 + 45 * parseInt(Math.ceil(Math.pow(10, i-1)), 10); // computing 10^d let p = parseInt(Math.ceil(Math.pow(10, d)), 10); // Most significant digit (msd) of n, // For 328, msd is 3 which can be obtained // using 328/100 let msd = parseInt(n / p, 10); // EXPLANATION FOR FIRST and SECOND TERMS IN // BELOW LINE OF CODE // First two terms compute sum of digits from // 1 to 299 // (sum of digits in range 1-99 stored in a[d]) + // (sum of digits in range 100-199, can be // calculated as 1*100 + a[d] // (sum of digits in range 200-299, can be // calculated as 2*100 + a[d] // The above sum can be written as 3*a[d] + // (1+2)*100 // EXPLANATION FOR THIRD AND FOURTH TERMS IN // BELOW LINE OF CODE // The last two terms compute sum of digits in // number from 300 to 328. The third term adds // 3*29 to sum as digit 3 occurs in all numbers // from 300 to 328. The fourth term recursively // calls for 28 return (msd * a[d] + (msd * (msd - 1) / 2) * p + msd * (1 + n % p) + sumOfDigitsFrom1ToN(n % p)); } let n = 328; document.write( "Sum of digits in numbers from 1 to " + n + " is " + sumOfDigitsFrom1ToN(n)); </script> |
输出:
Sum of digits in numbers from 1 to 328 is 3241
高效的算法还有一个优点,即即使在给定多个输入的情况下,我们也只需要计算数组“a[]”一次。
改进: 上述实现需要O(d) 2. )每次递归调用都会再次计算dp[]数组。第一次呼叫需要O(d),第二次呼叫需要O(d-1),第三次呼叫需要O(d-2),依此类推。我们不需要在每次递归调用中重新计算dp[]数组。下面是在O(d)时间内工作的修改后的实现。哪里 D 是输入数字中的位数。
C++
// C++ program to compute sum of digits // in numbers from 1 to n #include<bits/stdc++.h> using namespace std; int sumOfDigitsFrom1ToNUtil( int n, int a[]) { if (n < 10) return (n * (n + 1) / 2); int d = ( int )( log10 (n)); int p = ( int )( ceil ( pow (10, d))); int msd = n / p; return (msd * a[d] + (msd * (msd - 1) / 2) * p + msd * (1 + n % p) + sumOfDigitsFrom1ToNUtil(n % p, a)); } // Function to computer sum of digits in // numbers from 1 to n int sumOfDigitsFrom1ToN( int n) { int d = ( int )( log10 (n)); int a[d + 1]; a[0] = 0; a[1] = 45; for ( int i = 2; i <= d; i++) a[i] = a[i - 1] * 10 + 45 * ( int )( ceil ( pow (10, i - 1))); return sumOfDigitsFrom1ToNUtil(n, a); } // Driver code int main() { int n = 328; cout << "Sum of digits in numbers from 1 to " << n << " is " << sumOfDigitsFrom1ToN(n); } // This code is contributed by ajaykr00kj |
JAVA
// JAVA program to compute sum of digits // in numbers from 1 to n import java.io.*; import java.math.*; class GFG{ // Function to computer sum of digits in // numbers from 1 to n static int sumOfDigitsFrom1ToN( int n) { int d = ( int )(Math.log10(n)); int a[] = new int [d+ 1 ]; a[ 0 ] = 0 ; a[ 1 ] = 45 ; for ( int i = 2 ; i <= d; i++) a[i] = a[i- 1 ] * 10 + 45 * ( int )(Math.ceil(Math.pow( 10 , i- 1 ))); return sumOfDigitsFrom1ToNUtil(n, a); } static int sumOfDigitsFrom1ToNUtil( int n, int a[]) { if (n < 10 ) return (n * (n + 1 ) / 2 ); int d = ( int )(Math.log10(n)); int p = ( int )(Math.ceil(Math.pow( 10 , d))); int msd = n / p; return (msd * a[d] + (msd * (msd - 1 ) / 2 ) * p + msd * ( 1 + n % p) + sumOfDigitsFrom1ToNUtil(n % p, a)); } // Driver Program public static void main(String args[]) { int n = 328 ; System.out.println( "Sum of digits in numbers " + "from 1 to " +n + " is " + sumOfDigitsFrom1ToN(n)); } } /*This code is contributed by Narendra Jha.*/ |
Python3
# Python program to compute sum of digits # in numbers from 1 to n import math # Function to computer sum of digits in # numbers from 1 to n def sumOfDigitsFrom1ToN(n): d = int (math.log(n, 10 )) a = [ 0 ] * (d + 1 ) a[ 0 ] = 0 a[ 1 ] = 45 for i in range ( 2 , d + 1 ): a[i] = a[i - 1 ] * 10 + 45 * int (math.ceil( pow ( 10 , i - 1 ))) return sumOfDigitsFrom1ToNUtil(n, a) def sumOfDigitsFrom1ToNUtil(n, a): if (n < 10 ): return (n * (n + 1 )) / / 2 d = int (math.log(n, 10 )) p = int (math.ceil( pow ( 10 , d))) msd = n / / p return (msd * a[d] + (msd * (msd - 1 ) / / 2 ) * p + msd * ( 1 + n % p) + sumOfDigitsFrom1ToNUtil(n % p, a)) # Driver code n = 328 print ( "Sum of digits in numbers from 1 to" ,n, "is" ,sumOfDigitsFrom1ToN(n)) # This code is contributed by shubhamsingh10 |
C#
// C# program to compute sum of digits // in numbers from 1 to n using System; class GFG { // Function to computer sum of digits in // numbers from 1 to n static int sumOfDigitsFrom1ToN( int n) { int d = ( int )(Math.Log10(n)); int []a = new int [d+1]; a[0] = 0; a[1] = 45; for ( int i = 2; i <= d; i++) a[i] = a[i-1] * 10 + 45 * ( int )(Math.Ceiling(Math.Pow(10, i-1))); return sumOfDigitsFrom1ToNUtil(n, a); } static int sumOfDigitsFrom1ToNUtil( int n, int []a) { if (n < 10) return (n * (n + 1) / 2); int d = ( int )(Math.Log10(n)); int p = ( int )(Math.Ceiling(Math.Pow(10, d))); int msd = n / p; return (msd * a[d] + (msd * (msd - 1) / 2) * p + msd * (1 + n % p) + sumOfDigitsFrom1ToNUtil(n % p, a)); } // Driver code public static void Main(String []args) { int n = 328; Console.WriteLine( "Sum of digits in numbers " + "from 1 to " +n + " is " + sumOfDigitsFrom1ToN(n)); } } // This code contributed by Rajput-Ji |
Javascript
<script> // JavaScript program to compute sum of digits // in numbers from 1 to n // Function to computer sum of digits in // numbers from 1 to n function sumOfDigitsFrom1ToNUtil( n,a) { if (n < 10) return (n * (n + 1) / 2); var d = (parseInt)(Math.log10(n)); var p = (Math.ceil(Math.pow(10, d))); var msd =(parseInt) (n / p); return (msd * a[d] + (msd * (msd - 1) / 2) * p + msd * (1 + n % p) + sumOfDigitsFrom1ToNUtil(n % p, a)); } // Function to computer sum of digits in // numbers from 1 to n function sumOfDigitsFrom1ToN( n) { var d =(parseInt)(Math.log10(n)); var a= new Array(d + 1).fill(0); a[0] = 0; a[1] = 45; for ( var i = 2; i <= d; i++) a[i] = a[i - 1] * 10 + 45 * (parseInt)(Math.ceil(Math.pow(10, i - 1))); return sumOfDigitsFrom1ToNUtil(n, a); } var n = 328; document.write( "Sum of digits in numbers from 1 to " + n + " is " + sumOfDigitsFrom1ToN(n)) </script> |
输出:
Sum of digits in numbers from 1 to 328 is 3241
本文的计算公式为 舒巴姆·古普塔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END