刚看到这道题的时候,我的思路是,从1开始找,找到对应范围内所有各个位数相加小于10的数,将它们排入一个数组里,将他们各个位数之和排入另一个数组里,之后输出第一个数组里的数 和10与另一个数组内的数之差
#include<stdio.h>
int x[1500000],y[1500000];
int main()
{ int s=0,a,b,c,d,m=0,i,j,k;
while(scanf("%d",&a)!=EOF){
int main()
{ int s=0,a,b,c,d,m=0,i,j,k;
while(scanf("%d",&a)!=EOF){
for(i=0;i<5000;i++)
{ b=i;c=i;d=i;s=0;m=0;
for(j=1;d>=10;j++)
{
d=d/10;
m=j;
}
for(j=0;j<m+1;j++)
{
s=s+b%10;
b=b/10;
}
y[c]=s;
x[c]=c;
}j=0;k=0;
for(i=0;i<5000;i++)
if(y[i]<=10)
x[j++]=x[i];
x[j]='\0';
for(i=0;i<5000;i++)
if(y[i]<=10)
y[k++]=y[i];
y[j]='\0';
{ b=i;c=i;d=i;s=0;m=0;
for(j=1;d>=10;j++)
{
d=d/10;
m=j;
}
for(j=0;j<m+1;j++)
{
s=s+b%10;
b=b/10;
}
y[c]=s;
x[c]=c;
}j=0;k=0;
for(i=0;i<5000;i++)
if(y[i]<=10)
x[j++]=x[i];
x[j]='\0';
for(i=0;i<5000;i++)
if(y[i]<=10)
y[k++]=y[i];
y[j]='\0';
printf("%d%d\n",x[a],10-y[a]);
}}
}}
这个方法对我来说很容易想到,但相对来说操作起来比较麻烦。我在打的时候就忘记了,for(i=0;;i++)里面,不能对 i 进行操作,如果必须要这样做的话,必须要将 i 的值付给其他变量,因为还有 i++ 啊
这道题还用到了全局变量,这种打法对范围的要求特别大,而按照正常的定义方法无法定义超过10w 的数组,运用全局变量超过150w 都可以的。
下面介绍改进后的方法
从19开始,直接找到所有各个位数相加为10的数
#include<stdio.h>
int main()
{
int a,i,c,s,n=0;
scanf("%d",&a);
for(i=19;;i++)
{
s=0;
c=i;
while(c>0)
{
s=s+c%10;
c=c/10;
}
if(s==10)
n++;
if(n==a)
break;
}
printf("%d",i);
}
这个方法中有很多的值得学习的地方,比如说用for(i=0;;i++) 这个循环结构,当循环应该结束的时候用if 和break 结合跳出循环。同时仍然要注意在i 的循环中不能直接对i 进行操作。