经典指数          
原因
2041
浏览数
0
收藏数
 

牛牛选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过程中,牛牛会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum. 例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564. 牛牛现在给出一个sum,牛牛想让你求出一个正整数X经过上述过程的结果是sum. 输入描述: 输入包括正整数sum(1 ≤ sum ≤ 10^18) 输出描述: 输出一个正整数,即满足条件的X,如果没有这样的X,输出-1。 示例1 输入 564 输出 509

     举报   纠错  
 
切换
1 个答案
思路是反向推,数number有n位,除以 n个1得到的是最前面那位,比如564是3位,就是除以111, 564 / 111 = 5 ,所以X的第一位是5, 564 - 5*111 = 9 9 / 11 =0, 所以X的第二位是0, 9 - 0*11=9 9 / 1 =9 ,所以第三位是9. 理由是 如果正着算 是 509+509/10+509/100=564,用数学最简单的通分一写就明白了。 然后考虑什么时候没有对应的X值,就是最后一位剩下的是超过9的数,比如565,自己按上面的步骤写一下就懂了。 下面附上代码,菜鸟写的 不好请见谅。 #include #include using namespace std; typedef long long ll; int getDigit(ll num) {     int digit = 0;     while (num > 0) {         digit++;         num /= 10;     }     return digit; } ll nOne(int digit) {     ll num=0;     for (int i = 0; i < digit; ++i) {         num += ll(pow(10, i));          //这里一定要加上long long的强制转换 否则1e+17会有偏差     }     return num; } int main() {     ll num;     cin >> num;     int digit = getDigit(num);     int *pNum = new int[digit];     for (int i = 0; i < digit; ++i) {         ll digitOne = nOne(digit - i);         pNum[i] = num / digitOne;         if (pNum[i] > 9 ) {             cout << -1 << endl;             return 0;         }         num -= pNum[i] * digitOne;     }     for (int i = 0; i < digit; ++i)         cout << pNum[i];     cout << endl; }
 
切换
撰写答案
扫描后移动端查看本题