程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CF 135 DIV2 B Special Offer! Super Price 999 Bourles!

CF 135 DIV2 B Special Offer! Super Price 999 Bourles!

編輯:C++入門知識

題意:就是一個物品有一個價格,這個價格可以最多降低d,求在所下降價格不超過d的情況下,能夠使價格有最多的9且價格最高.拿樣例來說,
1029 102
原價為1029,最多可下降102元,在符合條件的范圍內,能夠取得最多的9且價格最高的是999.若沒有 符合條件的情況,則輸出原價。
思路:首先求出原價的位數,然後計算最多有多少個9,和原價比較以及判斷是否符合條件。之後就是一個模擬的過程,一點一點加,直到找到符合條件的借。中間有一些細節需要注意,而且中間運算還有可能超過__int64,都需要處理一下。
代碼:
[cpp]
#include <iostream> 
#include <string.h> 
#include <cstdio> 
using namespace std; 
 
typedef unsigned __int64 LL; 
int fun(LL x){ 
    int sum = 0; 
    while(x){ 
      sum++; 
      x /= 10; 
    } 
    return sum ; 

LL cal(int x){ 
    LL sum = 0; 
    for(int i = 1; i <= x; ++i){ 
       sum = sum * 10 + 9; 
    } 
    return sum; 

LL mi(int cnt){ 
    LL s = 1; 
    for(int i = 1; i <= cnt; ++i) 
        s *= 10; 
    return s; 

int main(){ 
    LL p,d; 
    while(scanf("%I64d%I64d",&p,&d) != EOF){ 
       LL value = p - d; 
       int cnt = fun(p); 
       LL ans = cal(cnt); 
       if(ans >= value  && ans <= p){ 
          printf("%I64d\n",ans); 
       } 
       else{ 
         LL x = value % 10; 
         LL y = value / 10; 
         LL z = y * 10 + 9; 
         if(z > p){ www.2cto.com
           z = z - 9; 
           printf("%I64d\n",p); 
           continue; 
         } 
         LL num = 0,xx = 0,yy = 0; 
         LL cnt = 1; 
         while(z <= p){ 
             cnt++; 
           xx = z / mi(cnt); 
           yy = z % mi(cnt); 
           z = xx * mi(cnt) + cal(cnt); 
           num = z; 
         } 
         num = xx * mi(cnt) + yy; 
         cnt--; 
         while(num <= p){ 
           num += mi(cnt); 
         } 
         printf("%I64d\n",num - mi(cnt)); 
       } 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved