• uva 10994


     1 //组合数学
     2 //计算sum{i从右往左数的第一个非0数字,p<=i<=q}。
     3 #include <cstdio>
     4 typedef long long ll;
     5 
     6 ll sum(ll n)
     7 {
     8     ll ans = 0, x;
     9     while(n)
    10     {
    11         x = n % 10;
    12         n /= 10;
    13         ans += ((1 + x) * x) / 2 + n * 45;  //当个位在循环的时候,高位的朋友你在干嘛?
    14     }
    15     return ans;
    16 }
    17 
    18 int main()
    19 {
    20     ll a, b;
    21     while(scanf("%lld%lld", &a, &b), a >= 0)
    22     {
    23         printf("%lld
    ", sum(b) - sum(a - 1));
    24     }
    25     return 0;
    26 }

    题目大意:给出l和r,求∑(l≤i≤r)F(i), F(i)函数题目中有。

    解题思路:由两边向中间缩进,然后l和r之间的数可以按照1~9划分(只会有这几种情况)。

     1 #include <stdio.h>
     2 #define ll long long
     3 ll ans;
     4 
     5 ll f(ll x) {
     6     if (x == 0)    return 0;
     7     else if (x % 10)
     8         return x % 10;
     9     else
    10         return  f(x / 10);
    11 }
    12 
    13 void solve(ll l, ll r) {
    14     if (r - l < 9) {
    15         for (int i = l; i <= r; i++)
    16             ans += f(i);
    17         return;
    18     }
    19 
    20     while (l % 10) {
    21         ans += f(l);
    22         l++;
    23     }
    24 
    25     while (r % 10) {
    26         ans += f(r);
    27         r--;
    28     }
    29     ans += 45 * (r - l) / 10;
    30     solve(l / 10, r / 10);
    31 }
    32 
    33 int main () {
    34     ll l, r;
    35     while (scanf("%lld%lld", &l, &r), l >= 0 || r >= 0) {
    36         ans = 0;
    37         solve(l, r);
    38         printf("%lld
    ", ans);
    39     }
    40     return 0;
    41 }

    其實只要看題目推敲一下,大概可以知道其實就是各個數字最低階不是0的數字的總和。

    可將題目要加的拆成各個位數來做,每一個位數都要考慮%10和/10的情況要加多少,將這些值全部加起來即可得解。

    P.S. 雖然p,q可以在32bits整數下存放,但可沒說總和也可以喔!

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 
     5 int main(){
     6   long long p, q;
     7   long long sum;
     8 
     9   while( scanf( "%lld%lld", &p, &q ) != EOF && !( p < 0 && q < 0 )){
    10     sum = 0;
    11 
    12     while( p || q ){
    13       sum += (q%10+p%10)*((q%10)-(p%10)+1)/2;
    14       sum += (q/10-p/10)*45;
    15 
    16       if( p%10 && (p/10 || q/10) ) p += 10;
    17       p /= 10;
    18       q /= 10;
    19     }
    20 
    21     printf( "%lld
    ", sum );
    22   }
    23   return 0;
    24 }
  • 相关阅读:
    Docker 容器间的单向连接
    使用 mysql 的 Docker 镜像
    Dockerfile 自动制作 Docker 镜像(三)—— 镜像的分层与 Dockerfile 的优化
    Dockerfile 自动制作 Docker 镜像(一)—— 基本命令
    在 Docker 的 CentOS7 镜像 中安装 mysql
    手动制作Docker镜像
    Docker容器基本命令注意点
    Linux基础15-Linux库函数
    Linux基础14-makefile
    Linux基础13-GDB调试
  • 原文地址:https://www.cnblogs.com/aze-003/p/5147893.html
Copyright © 2020-2023  润新知