

思路:一开始是按照题目意思做,发现tle了,于是用数学方法,发现题目中说数码和不超过10的六次方,那么可以联系上数码和,发现ans=不等于0的位数个数+数码和,但如果n[len-1]!=0时,先把它化为1再消0就可以节约一步
原代码
#include<stdio.h>
#include<string.h>
void cz1(int len,char n[]){
char temp[10005];
n[len-1]=n[len-1]-1;
}//减去1,默认n[len-1]>0
void cz2(int len,char n[]){
char temp[10005];
int cnt=0;
for(int i=0;i<len;i++){
if(n[i]!='0'){
temp[cnt++]=n[i];
}
}
temp[cnt]='\0';
strcpy(n,temp);
}//消去0
int main(){
int T;
scanf("%d",&T);
while(T--){
char n[10005];
scanf("%s",n);
int cnt=0;
while(n[0]!='0'){
int len=strlen(n);
if(n[len-1]=='0'){
cz2(len,n);
}else{
cz1(len,n);
}
cnt++;
}
printf("%d\n",cnt);
}
}
AC代码
#include<stdio.h>
#include<string.h>
int main(){
int T;
scanf("%d",&T);
while(T--){
char n[10005];
scanf("%s",n);
long long cnt=0;
int len=strlen(n);
long long sum=0;
for(int i=0;i<len;i++){
if(n[i]!='0'){
cnt++;
long long t=n[i]-'0';
sum+=t;
}
}
long long ans=cnt+sum;
if(n[len-1]!='0')ans--;
printf("%lld\n",ans);
}
}