输入一个数k,找第k个各位数相加等于10的数。

刚看到这道题的时候,我的思路是,从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){
    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';
    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 进行操作。
                                 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值