題意:就是一個物品有一個價格,這個價格可以最多降低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;
}