最后一位
题目描述
牛牛选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过程中,牛牛会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum.
例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564.
牛牛现在给出一个sum,牛牛想让你求出一个正整数X经过上述过程的结果是sum.
例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564.
牛牛现在给出一个sum,牛牛想让你求出一个正整数X经过上述过程的结果是sum.
输入描述:
输入包括正整数sum(1 ≤ sum ≤ 10^18)
输出描述:
输出一个正整数,即满足条件的X,如果没有这样的X,输出-1。
解题思路:
经过一系列擦操作之后:abc + ab + a = 564;
即:(a * 100 + b * 10 + c) + (a * 10 + b) + (a) =564;
即 :111 * a + 11 * b + 1 * c = 564;
对于四位数有1111*a+11*b+1*c+*d=x;
首先0<a<10,b<10,c<10,d<10;
可以给出一个求len位1的函数
之后x再减去len位1*a,相同的方法可以求得b
代码如下:
#include <iostream> #include <string> #include <cmath> #include<iomanip> /* 用例: 837592744927492746 对应输出应该为: -1 你的输出为: 753833470434743470 */ using namespace std; long long give(int len); int main() { string sum; int a[100],top=0; long long num_sum=0; cin>>sum; for(int i=0;i<sum.size();i++) { // num_sum+=(sum[i]-'0')*pow(10.0,sum.size()-1-i);这个不知道为甚麽是错的 num_sum=num_sum*10+(sum[i]-'0');//这个是对的 }//当i=12时发生错误,i>10 //当i=0时num_sum=799999999999999999为甚麽不是800000000000000000 // long long t=num_sum; // cout<<num_sum;return 0;//为甚麽转化出来的整数是错的 //sum_size=sum.size(); for(int i=sum.size();i>=1;i--) { a[top]=num_sum/give(i); num_sum=num_sum-a[top]*give(i); top++; } //cout<<top<<'\n'; for(int i=0;i<top;i++) { if(a[i]>=10) { cout<<-1;return 0; } } for(int i=0;i<top;i++) { cout<<a[i]; } // for(int i=11;i>=3;i--) // cout<<give(i)<<endl; } long long give(int len)//提供len位1 { long long sum=0; while(len-->0) { sum=sum*10+1; } return sum; }//837592744927492746
不一样的烟火